Подтвердить что ты не робот

IEnumerable не имеет метода Count

У меня есть следующий метод:

public bool IsValid
{
  get { return (GetRuleViolations().Count() == 0); }
}

public IEnumerable<RuleViolation> GetRuleViolations(){
  //code here
}

Почему это, когда я делаю .Count() выше, он подчеркивается красным?

Я получил следующую ошибку:

Ошибка 1 'System.Collections.Generic.IEnumerable' не содержит определения для "Count" и метод расширения "Count" принимает первый аргумент тип 'System.Collections.Generic.IEnumerable' (вы не видите используя директиву или сборку ссылка?) c:\users\a\documents\visual студия 2010\Projects\NerdDinner\NerdDinner\Models\Dinner.cs 15 47 NerdDinner

4b9b3361

Ответ 1

Вы добавляете:

using System.Linq;

вверху вашего источника и убедитесь, что у вас есть ссылка на сборку System.Core.

Count() - это метод расширения, предоставляемый System.Linq.Enumerable статический класс для LINQ to Objects и System.Linq.Queryable для LINQ to SQL и других поставщиков вне процесса.

EDIT: Фактически использование Count() здесь относительно неэффективно (по крайней мере, в LINQ to Objects). Все, что вы хотите знать, есть ли какие-то элементы или нет, не так ли? В этом случае Any() лучше подходит:

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}

Ответ 2

IEnumeration не имеет метода, называемого Count(). Это просто своего рода "последовательность элементов". Используйте, например, List, если вам явно нужно количество элементов. Если вы используете Linq, имейте в виду, что метод расширения Count() может фактически пересчитать количество элементов каждый раз, когда вы его вызываете.

Ответ 3

Any() или Count() методы в Linq работают только для общих типов.

IEnumerable<T>

Если у вас есть простой IEnumerable без типа, попробуйте использовать

IEnumerable<object> 

вместо.

Ответ 4

Как насчет:

public bool IsValid
{
    get { return (GetRuleViolations().Cast<RuleViolation>().Count() == 0); }
}