Warum hat List (Of T) nicht Count ()?

8
%Vor%

Der obige Code verursacht einen Fehler bei der Kompilierung. Wie Sie sehen können, versuche ich die Erweiterungsmethode Count(<predicate>) zu verwenden. Ich vermute, der Fehler liegt daran, dass es eine ähnlich benannte Eigenschaft Count in List class selbst gibt, die das Erweiterungselement versteckt.

Meine Fragen hier sind:

  1. Muss ich meine Klasse explizit in eine andere Klasse umwandeln, um auf die Count extension-Methode zugreifen zu können? Wenn ja, welche Klasse sollte es im obigen Szenario sein?

  2. Warum kann der Compiler nicht aus der Verwendung schließen, dass ich auf eine Methode und nicht auf eine Eigenschaft verweise?

  3. Umfasst das Casting einen erheblichen Overhead, wenn man bedenkt, dass dies eine stark genutzte Methode ist (die manchmal hunderte von Malen pro Sekunde aufgerufen wird)?

  4. Ist C # in dieser Hinsicht besser als VB.NET?

Ich verwende .NET 4.0 mit VS2010, wenn das etwas zu tun hat.

BEARBEITEN

Fehlermeldung:

  

' Public ReadOnly Property Count As Integer ' hat keine Parameter und seine   Rückgabetyp kann nicht indiziert werden.

    
dotNET 11.09.2013, 14:06
quelle

4 Antworten

6

Rufen Sie die Methode ohne die Syntax der Erweiterungsmethode auf:

%Vor%

Stellen Sie sicher, dass Sie System.Linq einen Import hinzugefügt haben.

    
Dan 11.09.2013, 14:09
quelle
5
  1. Sie können Me auf IEnumerable(Of MyObject) :

    anwenden %Vor%

    Oder verwenden Sie direkt die Methode Enumerable.Count() :

    %Vor%

    Extension Methoden werden vom Compiler in direkte statische ( shared in VB) Methodenaufrufe umgewandelt, also gibt es keinen Unterschied.

  2. Hab keine Ahnung, wirklich.

  3. Durch das Umsetzen auf den zugrunde liegenden Typ wird das Objekt selbst nicht geändert, sodass es keine Leistungseinbußen gibt (außer boxing ist beteiligt, was hier nicht der Fall ist).

  4. C # erlaubt keine Eigenschaften mit Parametern und es erfordert Eigenschaften, die ohne () aufgerufen werden, also ja, es ist besser in Situationen wie dieser.

    In VB.NET beziehen sich sowohl Me.Count() als auch Me.Count auf Count Eigenschaft von List(Of T ). In C # this.Count würde auf Eigenschaft verweisen und this.Count() würde die Erweiterungsmethode (wegen Klammern) verweisen.

MarcinJuraszek 11.09.2013 14:14
quelle
5

Verwenden Sie AsEnumerable für diesen Zweck:

%Vor%     
Meta-Knight 11.09.2013 14:20
quelle
1

Um auf # 4 zu antworten, funktioniert das in C # gut:

%Vor%     
TrueWill 11.09.2013 14:13
quelle