Where.FirstOrDefault()
検索を実行して最初の要素を取得するために を使用している人を頻繁に見かけます。 を単に使用しないのはなぜですかFind()
? 他に利点はありますか? 違いはわかりませんでした。
namespace LinqFindVsWhere
{
class Program
{
static void Main(string[] args)
{
List<string> list = new List<string>();
list.AddRange(new string[]
{
"item1",
"item2",
"item3",
"item4"
});
string item2 = list.Find(x => x == "item2");
Console.WriteLine(item2 == null ? "not found" : "found");
string item3 = list.Where(x => x == "item3").FirstOrDefault();
Console.WriteLine(item3 == null ? "not found" : "found");
Console.ReadKey();
}
}
}
ベストアンサー1
Find
方法はどこにありますかIEnumerable<T>
? (修辞的な質問です。)
およびメソッドWhere
は、、、などFirstOrDefault
を含む複数の種類のシーケンスに適用できます。を実装するシーケンスはすべてこれらのメソッドを使用できます。は に対してのみ使用できます。一般的に適用可能なメソッドは、よりList<T>
T[]
Collection<T>
IEnumerable<T>
Find
List<T>
再利用可能そしてより大きな影響力を持つようになります。
次に疑問に思うのは、そもそもなぜ find を追加したのかということです。これは良いヒントです。私が考えられる唯一のことは、FirstOrDefault が null 以外のデフォルト値を返すことができるということです。そうでなければ、無意味な追加に思えます。
Find
on はList<T>
他のメソッドより前に作成されました。List<T>
は .NET 2.0 でジェネリックとともに追加され、Find
そのクラスの API の一部でした。Where
およびは、.NET のより新しいバージョンである LinqFirstOrDefault
で拡張メソッドとして追加されましたIEnumerable<T>
。Linq が 2.0 リリースに存在していたらFind
追加されなかったと断言することはできませんが、以前の .NET バージョンに含まれていたが、それ以降のバージョンでは廃止または不要になった他の多くの機能については、おそらくそうでしょう。