Что такое твердая, изящная, допускающая повторное использование часть кода для определения, если IEnumerable пуст в.NET?

Он может это сделать, если вы неявно или явно устанавливаете выравнивание структуры. Строка, которая выровнена 4, всегда будет кратной 4 байтам, даже если размер ее членов будет чем-то, что не кратно 4 байтам.

Также библиотека может быть скомпилирована под x86 с 32- бит, и вы можете сравнить его компоненты с 64-битным процессом, это даст вам другой результат, если вы делаете это вручную.

9
задан Chris Ammerman 22 September 2008 в 21:15
поделиться

5 ответов

!enumerable.Any()

Попытается захватить первый элемент только.

Чтобы подробно остановиться, как/почему это работает, любой определяет если любой из компонентов IEnumerable соответствуйте заданной функции, если ни один не будет дан, затем то любой компонент успешно выполнится, означая, что функция возвратит true, если элемент будет существовать в счетном.

22
ответ дан 4 December 2019 в 08:17
поделиться

Для .net 1/2:

IEnumerator e;
try
{
   e = enumerable.GetEnumerator();
   return e.MoveNext();
}
finally
{ 
    if (e is IDisposable)
        e.Dispose();
}

Или, с дженериками:

using (IEnumerator<T> e = enumerable.GetEnumerator())
{
    return e.MoveNext();
}
2
ответ дан 4 December 2019 в 08:17
поделиться

Одна вещь остерегаться с любым из этих методов состоит в том, что не все перечисления могут быть назад прокручены, например, все реализации Системы. Данные. IDataReader может только пробежать однажды.

В этих случаях у Вас действительно нет стоимости в a foreach цикл, пока Вы объясняете то, что он даже не мог бы циклично выполниться однажды.

0
ответ дан 4 December 2019 в 08:17
поделиться

Первый метод имеет простую реализацию Пустого дополнительного метода: http://signum.codeplex.com/SourceControl/changeset/view/25903#510468

0
ответ дан 4 December 2019 в 08:17
поделиться

Вы правы, что нет никакого идеального ответа. IEnumerable только поддерживает повторение и не гарантирует, что перечисление повторяемо. Вы не можете узнать, содержит ли перечисление элементы, не называя MoveNext, по крайней мере, однажды, и после того как Вы сделали так, Вы не можете гарантировать, что смогли снова использовать перечисление: это допустимо для IEnumerable. Сброс для броска NotSupportedException. Из http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.reset.aspx:

"Метод Сброса предусмотрен совместимость COM. Это должно не обязательно быть реализовано; вместо этого, реализатор может просто бросить NotSupportedException".

Дополнительные методы как IEnumerable <T>.Count и IEnumerable <T>.Any должны назвать MoveNext под покрытиями. Полезные обертки, но не избегают того, что в (редких) случаях, где перечисление не поддерживает Сброс, у Вас могла быть проблема.

2
ответ дан 4 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: