IEnumerable hat keine Count-Methode

81

Ich habe die folgende Methode:

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

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

Warum ist es, wenn ich es .Count()oben mache, rot unterstrichen?

Ich habe folgenden Fehler erhalten:

Fehler 1 'System.Collections.Generic.IEnumerable' enthält keine Definition für 'Count' und es konnte keine Erweiterungsmethode 'Count' gefunden werden, die ein erstes Argument vom Typ 'System.Collections.Generic.IEnumerable' akzeptiert (fehlt Ihnen ein Verwenden Sie eine Direktive oder eine Assembly-Referenz?) c: \ Benutzer \ a \ Dokumente \ Visual Studio 2010 \ Projekte \ NerdDinner \ NerdDinner \ Models \ Dinner.cs 15 47 NerdDinner

Aherlambang
quelle
Hatte das gleiche Problem. Aus irgendeinem Grund können Sie nicht mit der rechten
Maustaste darauf
Seufzer! Ich habe System.Linq enthalten, erhalte aber immer noch diesen Fehler. (Obwohl die Fehlermeldung das erste Argument als "System.Linq.IQueryable" bezeichnet.)
Hot Licks

Antworten:

158

Sie fügen hinzu:

using System.Linq;

Stellen Sie sicher, dass Sie einen Verweis auf die System.Core-Assembly haben.

Count()ist eine Erweiterungsmethode, die von der System.Linq.Enumerablestatischen Klasse für LINQ to Objects sowie System.Linq.Queryablefür LINQ to SQL und andere Out-of-Process-Anbieter bereitgestellt wird.

BEARBEITEN: Tatsächlich ist die Verwendung Count()hier relativ ineffizient (zumindest in LINQ to Objects). Alles , was Sie wissen wollen , ist , ob es irgendwelche Elemente oder nicht, nicht wahr? In diesem Fall Any()passt besser:

public bool IsValid
{
  get { return !GetRuleViolations().Any(); }
}
Jon Skeet
quelle
Wenn diese Referenz einen Fehler anzeigt, stellen Sie sicher, dass das Zielframework Ihres Projekts (in den Projekteigenschaften, Registerkarte Anwendung) auf .NET Framework 3.5 oder 4 festgelegt ist. Erweiterungsmethoden funktionieren unter 2.0 oder früher nicht.
Willvv
1
Ich hatte die Verwendung von System.Linq; Aber mein Problem wird dadurch nicht behoben. Wie kann ich sicherstellen, dass ich einen Verweis auf die System.Core-Assembly erhalten habe?
Aherlambang
Oh egal, ich habe es behoben ... was ist der Unterschied zwischen System.data.linq und System.Linq
Aherlambang
@ Alexander: Das sind ganz andere Namespaces. System.Data.Linqist spezifisch für LINQ to SQL.
Jon Skeet
1
@skyfoot: Nein, das wird es wirklich nicht. Es gibt Ihnen 4. Wenn Sie anders denken, stellen Sie bitte eine Frage mit einem kurzen, aber vollständigen Programm, das das Problem demonstriert.
Jon Skeet
7

Any()oder Count()Methoden in Linq funktionieren nur für generische Typen.

IEnumerable<T>

Wenn Sie eine einfache IEnumerableohne Typ haben, versuchen Sie zu verwenden

IEnumerable<object> 

stattdessen.

Renzo Ciot
quelle
2

IEnumerationhat keine Methode aufgerufen Count(). Es ist nur eine Art "Folge von Elementen". Verwenden ListSie diese Option beispielsweise, wenn Sie die Anzahl der Elemente explizit benötigen. Wenn Sie Linq verwenden, beachten Sie, dass die Erweiterungsmethode Count()die Anzahl der Elemente bei jedem Aufruf möglicherweise neu zählt.

Danvil
quelle
-1

Wie wäre es mit:

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