IEnumerable no tiene un método Count

81

Tengo el siguiente método:

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

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

¿Por qué cuando lo hago .Count()arriba está subrayado en rojo?

Tuve el siguiente error:

Error 1 'System.Collections.Generic.IEnumerable' no contiene una definición para 'Count' y ningún método de extensión 'Count' aceptando un primer argumento de tipo 'System.Collections.Generic.IEnumerable' podría ser encontrado (¿le falta un usando directiva o una referencia de ensamblado?) c: \ users \ a \ documents \ visual studio 2010 \ Projects \ NerdDinner \ NerdDinner \ Models \ Dinner.cs 15 47 NerdDinner

aherlambang
fuente
Tenía el mismo problema. Por alguna razón, no puede hacer clic derecho en esto y elegir "Resolver ..." para solucionarlo :(
micahhoover
¡Suspiro! Tengo System.Linq incluido pero sigo recibiendo este error. (Aunque el mensaje de error nombra el primer argumento como "System.Linq.IQueryable".)
Hot Licks

Respuestas:

158

Añades:

using System.Linq;

en la parte superior de su fuente y asegúrese de tener una referencia al ensamblaje System.Core.

Count()es un método de extensión proporcionado por la System.Linq.Enumerableclase estática para LINQ to Objects, y System.Linq.Queryablepara LINQ to SQL y otros proveedores fuera de proceso.

EDITAR: De hecho, usar Count()aquí es relativamente ineficiente (al menos en LINQ to Objects). Todo lo que quiere saber es si hay algún elementos o no, ¿verdad? En ese caso, Any()se ajusta mejor:

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}
Jon Skeet
fuente
Si esta referencia le da un error, verifique que el marco de destino de su proyecto (en las propiedades del proyecto, pestaña Aplicación) esté configurado en .NET Framework 3.5 o 4. Los métodos de extensión no funcionarán en 2.0 o anteriores.
willvv
1
He tenido el uso de System.Linq; pero no resuelve mi problema ... ¿cómo puedo asegurarme de que tengo una referencia al ensamblado System.Core?
aherlambang
Oh no importa, lo arreglé ... ¿cuál es la diferencia entre System.data.linq y System.Linq?
aherlambang
@Alexander: Son espacios de nombres completamente diferentes. System.Data.Linqes específico de LINQ to SQL.
Jon Skeet
1
@skyfoot: No, realmente no lo hará. Le dará 4. Si piensa lo contrario, envíe una pregunta con un programa breve pero completo que demuestre el problema.
Jon Skeet
7

Any()o los Count()métodos en Linq funcionan solo para tipos genéricos.

IEnumerable<T>

Si tiene un simple IEnumerablesin un tipo, intente usar

IEnumerable<object> 

en lugar.

Renzo Ciot
fuente
2

IEnumerationno tiene un método llamado Count(). Es solo una especie de "secuencia de elementos". Úselo, por ejemplo, Listsi necesita explícitamente el número de elementos. Si usa Linq, tenga en cuenta que el método de extensión Count()puede volver a contar el número de elementos cada vez que lo llame.

Danvil
fuente
-1

Qué tal si:

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