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
これを行うよりクリーンな方法はありますか?
LINQを使用します。
var value = MyList.First(item => item.name == "foo").value;
(もちろん、これは最初の一致を見つけるだけです。これには多くのオプションがあります。)
または、Find
の代わりに FindIndex
を使用します。
var value = MyList.Find(item => item.name == "foo").value;
ただし、LINQを使用することを強くお勧めします。最近では、はるかに慣用的なアプローチです。
(.NET命名規則に従うこともお勧めします。)
Where
を使用してフィルタリングし、Select
を使用して目的の値を取得できます。
MyList.Where(i=>i.name == yourName).Select(j=>j.value);
比較に_==
_の代わりに.Equals()
を使用します。
そのようです:
_MyClass item = MyList.Find(item => item.name.Equals("foo"));
_
特に、StringComparisonのようなオプションが用意されているため、これは素晴らしいです。例:
_MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);
_
これにより、コードで大文字と小文字の特殊文字を無視できます。さらにオプションがあります。
関数検索を使用すると、よりクリーンな方法です。
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
....
}
Enumerable.First
は、インデックスの代わりに要素を返します。どちらの場合も、一致する要素がリストにない場合は例外が発生します(インデックス-1でアイテムを取得しようとすると元のコードはIndexOutOfBoundsException
をスローしますが、First
はスローしますInvalidOperationException
)。
MyList.First(item => string.Equals("foo", item.name)).value