31

私はList<MyClass> MyListどこにいる

public class MyClass
{
    public string name { get; set; }
    public string value { get; set; }
}

名前を指定して、対応する値を取得したいと思います。現在、次のように実装しています。

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value

これを行うためのよりクリーンな方法はありますか?

4

6 に答える 6

91

LINQ を使用します。

var value = MyList.First(item => item.name == "foo").value;

(もちろん、これは最初の一致を見つけるだけです。これには多くのオプションがあります。)

またはFind代わりに使用FindIndex

var value = MyList.Find(item => item.name == "foo").value;

ただし、LINQ を使用することを強くお勧めします。最近では、より慣用的なアプローチになっています。

(.NET 命名規則に従うこともお勧めします。)

于 2013-04-23T19:06:06.833 に答える
13

を使用しWhereてフィルタリングしSelect、目的の値を取得できます。

MyList.Where(i=>i.name == yourName).Select(j=>j.value);
于 2013-04-23T19:05:25.417 に答える
5

.Equals()の代わりに比較に使用し==ます。

そのようです:

MyClass item = MyList.Find(item => item.name.Equals("foo"));

特に、素晴らしい StringComparison のようなオプションが提供されるためです。例:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);

これにより、コードで大文字と小文字の特殊文字を無視できるようになります。より多くのオプションがあります。

于 2015-03-12T12:04:28.220 に答える
3

Enumerable.Firstインデックスの代わりに要素を返します。どちらの場合も、一致する要素がリストに表示されない場合は例外が発生します (元のコードではIndexOutOfBoundsException、インデックス -1 の項目を取得しようとすると がスローされますが、FirstがスローされますInvalidOperationException)。

MyList.First(item => string.Equals("foo", item.name)).value
于 2013-04-23T19:06:32.690 に答える