[トピック内 6 記事 (1 - 6 表示)] << 0 >>
■No89382 (ルパン さん) に返信 > [] で指定して目的のデータを取得する方法を教えてください。 Microsoft の Web サイトの C# のチュートリアルにインデクサの説明があって、非常に参考 になりました。今はリンク切れでアクセスできませんので、それを以下に貼っておきます。 参考になれば幸いです。 using System; using System.IO; // インデクサのチュートリアル // // クラスのメンバにインデクサを定義すると、そのクラスのオブジェクトのメンバには [] 配列アクセ // ス演算子を使用してアクセスできる。 // // 注: file[i] という書き方をするので紛らわしいが、その意味は、file が指すオブジェクトにおい // て、インデクサの定義に従って i が指すメンバにアクセスするということ。(オブジェクトの // 配列を作ってその i 番目にアクセスするということではない) // // インデクサは強力な機能だが、配列形式の抽象化が妥当である場合に限り使用すべき。通常のメソッ // ドの使用とどちらが適しているかを慎重に考慮すること。 // // 以下のサンプルでは、ファイル(正確には、FileStream インスタンスへの参照型変数)と、そのフ // ァイルの特定のバイトにアクセスできるよう定義されたインデクサをメンバに持つクラスを定義する。 // そのクラスの参照型を file と定義し、インスタンスを作成してその参照値を file に代入すれば、 // file[i] で i が指す位置のファイルのバイトに、プロパティと同様な形でアクセスできる。 namespace Tutorial_03 { public class FileByteArray { Stream stream; // Stream は abstract クラス(他のクラスの基本クラスとなるのみ) public FileByteArray(string fileName) // 名前 fileName のファイルをオープン { stream = new FileStream(fileName, FileMode.Open); } public void Close() // ファイルをクローズするメソッド { stream.Close(); stream = null; } // インデクサ // プロパティとは、名前がない点とアクセサがパラメータ(index)を受け取る点が異なる。 public byte this[long index] { // ファイルから index 位置の1バイトを読んで返す get { byte[] buffer = new byte[1]; stream.Seek(index, SeekOrigin.Begin); // FileStream で override したメソッド stream.Read(buffer, 0, 1); // 同上 return buffer[0]; } // ファイルの index 位置に1バイトを書き込む set { byte[] buffer = new byte[1] { value }; stream.Seek(index, SeekOrigin.Begin); stream.Write(buffer, 0, 1); // FileStream で override したメソッド } } // ファイルのバイト数を返すプロパティ public long Length { get { return stream.Seek(0, SeekOrigin.End); } } } // 試験用クラス。ファイルのバイトの並びをひっくり返す // 改行は Windows のテキストファイルでは CR と FF だが、この順序を反対にして NotePad で // 見ると文字化けしたように見えるので注意。コマンドプロンプトで type コマンドで見れば OK // 日本語(2バイトコード)はバイト単位で並びをひっくり返すと文字化けするので注意。 public class Reverse { public static void Main(string[] args) { if (args.Length == 0) // 引数がない場合 { Console.WriteLine("tutorial_03 <filename>"); return; } FileByteArray file = new FileByteArray(args[0]); long len = file.Length; // ファイルの大きさ(バイト数) for (long i = 0; i < len / 2; ++i) { byte t; t = file[i]; // インデクサの get を呼び位置 i の byte を得て t に代入 file[i] = file[len - i - 1]; // len-i-1 位置の byte を i の位置に書き込む file[len - i - 1] = t; // len-i-1 位置に t を書き込む } file.Close(); } } }
管理者用
- Child Tree -