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

您应该尽量避免枚举它超过必要的次数(即使短路,如Firstand Any) - 如何:

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

这适用于类(因为您可以将引用与 null 进行比较)。

于 2009-05-28T04:12:57.817 回答
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 回答
1

如果您预计序列中可能有空值,您可以自己处理枚举器。

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

您可以将代码缩短为以下

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

如果集合为空,则 nextrecord 将包含 First 元素(如果有一个元素)或 null 。

于 2009-05-28T04:14:54.233 回答