C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

[]指定のデータを取得する方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■89382 / inTopicNo.1)  []指定のデータを取得する方法
  
□投稿者/ ルパン (1回)-(2018/11/22(Thu) 10:55:55)

分類:[.NET 全般] 

[] で指定して目的のデータを取得する方法を教えてください。

DATA["A"] とか DATA[0] とすると "aaa" が返されるようにです。

たとえば
  DataTable dt があるとすると
  dt.Rows[0][0], dt.Rows[0]["COL0"], dt.Rows["ROW0"]["COL0"]
で取得できるようなものを作りたいのです。

どうすればいいのか全く分かりません。

想像ではこんな感じ?

string[] data = new string[] { "aaa", "bbb", "ccc", "ddd" };
string[] num = new string[] { "A", "B", "C", "D" };

private string DATA[string Num]
{
 int inum = num.IndexOf(Num);
 return (data[inum]);
}

引用返信 編集キー/
■89383 / inTopicNo.2)  Re[1]: []指定のデータを取得する方法
□投稿者/ 魔界の仮面弁士 (1951回)-(2018/11/22(Thu) 11:01:48)
2018/11/22(Thu) 11:06:29 編集(投稿者)

No89382 (ルパン さん) に返信
> [] で指定して目的のデータを取得する方法を教えてください。
> DATA["A"] とか DATA[0] とすると "aaa" が返されるようにです。

C# ですよね。データとして保持したいという話なら、
Dictionary<TKey,TValue> ジェネリック クラスを使いましょう。


あるいは自作クラス上に、[] で読み書きできるメンバーを
追加したいという意味だとすれば、
『インデクサ』について調べてみてください。

インデクサを用意する場合は、コード エディタ上に
「indexer」と打ち、空白等を空けずに続けて Tab キーを 2 回押します。
これで必要最小限のコードが雛形として自動生成されますので、
引数や戻り値の型などを、適宜書き換えて使ってみてください。
引用返信 編集キー/
■89385 / inTopicNo.3)  Re[1]: []指定のデータを取得する方法
□投稿者/ WebSurfer (1675回)-(2018/11/22(Thu) 11:39:34)
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();
        }
    }
}

引用返信 編集キー/
■89387 / inTopicNo.4)  Re[2]: []指定のデータを取得する方法
□投稿者/ 魔界の仮面弁士 (1953回)-(2018/11/22(Thu) 12:04:54)
No89385 (WebSurfer さん) に返信
> // 改行は Windows のテキストファイルでは CR と FF だが、

FF(0x0C:form feed) ではなく、
LF(0x0A:line feed) なのでは。
引用返信 編集キー/
■89390 / inTopicNo.5)  Re[3]: []指定のデータを取得する方法
□投稿者/ WebSurfer (1676回)-(2018/11/22(Thu) 16:36:24)
No89387 (魔界の仮面弁士 さん) に返信

> FF(0x0C:form feed) ではなく、
> LF(0x0A:line feed) なのでは。

ご指摘の通り LF の間違いです。
引用返信 編集キー/
■89401 / inTopicNo.6)  Re[4]: []指定のデータを取得する方法
□投稿者/ ルパン (2回)-(2018/11/26(Mon) 08:22:58)
No89390 (WebSurfer さん) に返信
No89387 (魔界の仮面弁士 さん) に返信

インデクサというんですね。
言葉がわからないと検索も思うようにいかないんですね

大変参考になりました。
ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ