Проверка отсутствия элементов в IEnumerable (Of T) - элемент Linq и операторы квантора - PullRequest
4 голосов
/ 28 мая 2009

Для моей функции

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 ]

6 голосов
/ 28 мая 2009

Вам следует избегать перечисления его больше, чем необходимо (даже если оно замкнуто, например, First и Any) - как насчет:

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

Это хорошо работает с классами (так как вы можете просто сравнить ссылку с нулем).

1 голос
/ 28 мая 2009

Если вы ожидаете, что в последовательности могут быть нулевые значения, вы можете обработать перечислитель самостоятельно.

var enumerator = CallbackSearch.LoadOpenListToProcess(p).GetEnumerator();
if (enumerator.MoveNext()) {
  var item = enumerator.Current;
  ...
}
1 голос
/ 28 мая 2009

Вы можете сократить код до следующего

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

nextrecord будет содержать элемент First, если он был, или ноль, если коллекция была пустой.

0 голосов
/ 07 июня 2013

Вы можете добавить метод расширения следующим образом:

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

        return false;
    }
}
...