IEnumerable не имеет метода подсчета
-
27-09-2019 - |
Вопрос
У меня есть следующий метод:
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
public IEnumerable<RuleViolation> GetRuleViolations(){
//code here
}
Почему, когда я делаю .Count()
Выше он подчеркивается в красном?
Я получил следующую ошибку:
Ошибка 1 'System.collections.generic.ienableable' не содержит определения для «count», и нет метода расширения «подсчет», принимая первый аргумент типа «System.Collections.generic.». Используя директиву или ссылку на сборку?) C: Users A Documents Visual Studio 2010 Projects Nerddinner Nerddinner Models Nunder.cs 15 47 Nerddinner
Решение
Вы добавляете:
using System.Linq;
В верхней части вашего источника и убедитесь, что у вас есть ссылка на сборку System.Core.
Count()
это метод расширения, предоставляемый System.Linq.Enumerable
Статический класс для Linq к объектам и System.Linq.Queryable
Для LINQ до SQL и других провайдеров внепроцесс.
Редактировать: на самом деле, используя Count()
Здесь относительно неэффективно (по крайней мере, в Linq к объектам). Все, что вы хотите знать, есть ли Любые элементы или нет, верно? В таком случае, Any()
лучше подходит:
public bool IsValid
{
get { return !GetRuleViolations().Any(); }
}
Другие советы
Any()
или Count()
Методы в LINQ работают только для универсальных типов.
IEnumerable<T>
Если у вас есть простой IEnumerable
Без типа, попробуйте использовать
IEnumerable<object>
вместо.
IEnumeration
не имеет метода под названием Count()
. Отказ Это просто вид «последовательности элементов». Используйте, например List
Если вы явно нуждаетесь в количестве элементов. Если вы используете LINQ, имейте в виду, что метод расширения Count()
может фактически пересчитать количество элементов каждый раз, когда вы называете это.
Как насчет:
public bool IsValid
{
get { return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); }
}