5

次のようなオブジェクトのリストを安全に検索します。

var someResult = myList.FirstOrDefault(x=>x.SomeValue == "SomethingHere");

私の基準に一致するオブジェクトがない場合は、someResultnull になります。

しかし、必要なオブジェクトのインデックスしか持っていない場合、状況はあまり良くありません。私はこのようなことをしなければならないようです:

try
{
    var someResult = myList[4];
}
catch (ArgumentOutOfRangeException)
{
    someResult = null;
}

書かなければならないことはひどいことではないことを認めます。しかし、インデックスが偽物になってしまった場合、リストに null を返すだけの方法があるはずだと私には思えます。

既存の .net メソッドを使用して 1 行 (または 2 行) のルックアップを行う方法はありますか?

(拡張メソッドを簡単に記述できることはわかっていますが、これを行う組み込みの方法があるかどうか疑問に思っています。)

4

4 に答える 4

11

CBの提案が必要だと思いますElementAtOrDefault-投票してください。

他にも何点か補足させていただきます...

あなたのtry/catchソリューションについて:

書かなければならないことはひどいことではないことを認めます。

これには例外を使用しないでください。あなたのアプローチはより冗長で、例外は遅いため、パフォーマンスが低下し、例外は例外的な状況でのみ使用する必要があります。


条件演算子を使用して、LINQ を使用せずにこれを記述するのもかなり簡単です。

var someResult = myList.Count > 4 ? myList[4] : null;
于 2012-07-10T21:40:18.580 に答える
10

LINQ 拡張機能 .ElementAtOrDefault() を使用して、目的を達成できる場合があります。

List<Foo> foos = new List<Foo>();
Foo element = foos.ElementAtOrDefault(4);

ただし、ジェネリック型が参照型または文字列であることに注意する必要があるList<T>ため、返される「デフォルト」は実際には null です。返されるデフォルトは default(T) です。

于 2012-07-10T21:58:00.083 に答える
3

はい、インデックスしかない場合でも LINQ を使用できます。

var someResult = myList
            .Select((x, i) => new { X = x, Index = i })
            .FirstOrDefault(x => x.Index == 4);

Enumerable.Select メソッド (IEnumerable、Func)

要素のインデックスを組み込むことにより、シーケンスの各要素を新しい形式に射影します。

于 2012-07-10T21:41:45.727 に答える
2

C・Bの答えは勝つけど、2位争いできるよね?

var someResult = myList.Skip(4).FirstOrDefault();
于 2012-07-10T22:24:44.397 に答える