web-dev-qa-db-ja.com

値を含むList <>の要素を検索します

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

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

23
RaGe

LINQを使用します。

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

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

または、Findの代わりに FindIndex を使用します。

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

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

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

76
Jon Skeet

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

MyList.Where(i=>i.name == yourName).Select(j=>j.value);
13

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

そのようです:

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

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

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

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

5
user3801839

関数検索を使用すると、よりクリーンな方法です。

MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}
4
misak

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

MyList.First(item => string.Equals("foo", item.name)).value
3
Sam Harwell