6

私は簡単なクラスを持っています:

public class MyClass
{
  public string MyClassName { get; private set; }
  public string MyClassValue { get; private set; }
}

そして、次のようなMyClassオブジェクトの配列を保持したいと思います。

MyClass[] myClasses = new MyClass[5];

「コレクション」オブジェクトを作成せずに、文字列インデクサーによってオブジェクトの配列内のそれらのオブジェクトの1つにアクセスできるようにすることは可能ですか(これは正しい用語です)。

たとえば、myClasses [2]のMyClassNameプロパティに値"andegre"がある場合、次のようにアクセスするにはどうすればよいですか。

MyClass andegre = myClasses["andegre"];

次のようなことをする代わりに:

MyClass andegre = myClasses[GetIndexOfOfMyClassName("andegre")];

TIA

4

3 に答える 3

3

カスタムインデクサーが既存のコレクションで機能するためには、そのコレクションは、インデクサーが実装されたカスタムコレクションである必要があります。これは、背後にあるロジックを使用して、任意の引数をとることができます。文字列を取得するカスタムインデクサーは、カスタムタイプで完全に可能です。

(ネイティブの.NET配列のように)を使用しているときに使用されるインデクサーをオーバーライドする方法はありませんMyClass[]。取得するのは序数のインデクサーだけです。

または、他の回答が示唆しているように、必要なデータをクエリするには、LINQ to Objects(単にLINQと呼ばれます)を使用できます。

于 2012-11-06T13:47:36.793 に答える
3

MyClass[] myClassesは配列 (実際にはvector ) です。配列/ベクトルには文字列インデクサーがなく、位置アクセスのみです。

必要なものを取得するには、辞書のようなものが必要です。たとえば、次のようになります。

var myClasses = new Dictionary<string,MyClass>();
myClasses.Add("Fred", new MyClass {...});
myClasses.Add("Betty", new MyClass {...});
myClasses.Add("Wilma", new MyClass {...});
// etc

それから:

MyClass obj = myClasses["Fred"];

また:

MyClass obj;
if(myClasses.TryGetValue("Fred", out obj)) {
   // found Fred - use obj
} else {
   // no Fred here - don't look at obj
}
于 2012-11-06T13:52:27.853 に答える
1

LINQ の世界へようこそ!

MyClass andegre =
    myClasses.FirstOrDefault(item => item.MyClassValue.Equals("andegre"));
于 2012-11-06T13:43:38.623 に答える