1. ホーム
  2. c#

[解決済み] Find() vs. Where().FirstOrDefault()

2022-04-20 14:22:56

質問

を使っている人をよく見かけます。 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();
        }
    }
}

解決方法は?

はどこですか? Find メソッドで IEnumerable<T> ? (修辞的な質問)

は、その WhereFirstOrDefault メソッドは、以下のような複数の種類のシーケンスに対して適用可能です。 List<T> , T[] , Collection<T> など。を実装する任意のシーケンスは IEnumerable<T> はこれらのメソッドを使用することができます。 Find が利用できるのは List<T> . 一般的に適用可能なメソッドは、その後、より多くの 再利用可能 そして、より大きなインパクトを与えることができるのです。

次の質問は、なぜfindを全く付けなかったのかということですね。これは良いヒントです。唯一考えられるのは、FirstOrDefaultがnull以外の別のデフォルト値を返せるようにしたことです。そうでなければ、無意味な追加としか思えません。

Find オン List<T> は他のメソッドより優先されます。 List<T> は.NET 2.0のジェネリックスで追加されたものであり Find はそのクラスのAPIの一部でした。 WhereFirstOrDefault の拡張メソッドとして追加されました。 IEnumerable<T> を、.NETの後期バージョンであるLinqで実現しました。もしLinqが2.0のリリースで存在したなら、私はそのことを確信を持って言うことはできません。 Find しかし、これは、以前の.NETバージョンに搭載され、後のバージョンで廃止または冗長となった他の多くの機能についても言えることです。