Так что, если вы хотите просто проверить, есть ли у IEnumerable<T>
какие-либо предметы, вы должны использовать .Any()
вместо .count > 0
- особенно когда вы нажимаете такие вещи, как LINQ-To-Entities и .count
могут иметь большой штраф за выполнение.Проверка того, имеет ли произвольное перечисление какие-либо элементы без генераторов
У меня есть проблема в том, что я пишу IValueConverter
, чтобы изменить видимость объектов в зависимости от того, имеет ли или нет перечислимы предметы или нет:
public class CollectionEmptyVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var col = value as ICollection;
if (col == null) { return Visibility.Collapsed.ToString(); }
return (col.Count > 0) ? Visibility.Visible.ToString() : Visibility.Collapsed.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
Таким образом, в этой ситуации я не могу использовать нормальные методы расширения на IEnumerable<T>
, потому что в настоящее время я не могу иметь <T>
. Моя текущая реализация ограничивает меня тем, что реализует ICollection
, что может не всегда быть желательным.
Как я могу сделать это более эффективно? Голый IEnumerable
(sans <T>
) не имеет .Any()
.
Только спросив я закончил с 'col.GetEnumerator() MoveNext()', который работает так же - вопрос существа, которое было бы быстрее.? Конечно, это довольно близкий вызов в любом тексте. Будут отмечены как правильные в любом случае. – PhonicUK
@PhonicUK, поскольку счетчики реализуют 'IDisposable', вы не должны делать такую команду. Вы можете обернуть его при использовании и вернуть 'MoveNext()', чтобы убедиться, что он удален. –
@TimS. Я смущен - 'IEnumerator' не' IDisposable'. –