4

私の機能のために

IEnumerable<CallbackListRecord> LoadOpenListToProcess(CallbackSearchParams usp);

シーケンスに要素が含まれていない場合、この行はエラーになります(必要に応じて)

CallbackListRecord nextRecord = CallbackSearch.LoadOpenListToProcess(p).First();

以下に変更しました

CallbackListRecord nextRecord = null;
IEnumerable<CallbackListRecord> nextRecords = CallbackSearch.LoadOpenListToProcess(p);
if (nextRecords.Any())
{
    nextRecord = nextRecords.First();
}

IEnumerableシーケンスに要素がないかどうかを判断するための、より優れた、より簡単な、またはより洗練された方法はありますか?

4

4 に答える 4

6

First必要以上に列挙しないようにする必要があります(とのように短絡した場合でもAny)-どうですか?

var nextRecord = CallbackSearch.LoadOpenListToProcess(p).FirstOrDefault();
if(nextRecord != null) {
    // process it...
}

これはクラスでうまく機能します(参照をnullと比較できるため)。

于 2009-05-28T04:12:57.817 に答える
1

コードを次のように短縮できます

var nextrecord = CallbackSearch.LoadOpenListToProcess(p).FirstOrDefault();

nextrecordには、First要素が存在する場合はFirst要素が含まれ、コレクションが空の場合はnullが含まれます。

于 2009-05-28T04:14:54.233 に答える
1

シーケンスにnull値が含まれる可能性があると予想される場合は、列挙子を自分で処理できます。

var enumerator = CallbackSearch.LoadOpenListToProcess(p).GetEnumerator();
if (enumerator.MoveNext()) {
  var item = enumerator.Current;
  ...
}
于 2009-05-28T05:45:10.493 に答える
1

次のような拡張メソッドを追加できます。

public static class Extensions
{
    public static bool HasElements<T>(this IEnumerable<T> collection)
    {
        foreach (T t in collection)
            return true;

        return false;
    }
}
于 2013-06-07T09:09:43.210 に答える