IEnumerable-Daten von LINQ als Parameter an eine Methode übergeben [duplizieren]

8

Ich habe die folgende LINQ Anweisung, deren Ausgabe in einer anderen Methode bearbeitet werden muss:

%Vor%

Was sollte der Datentyp des Parameters in der Methode sein, die diese Daten benötigt?

    
Aadith 19.01.2013, 15:37
quelle

3 Antworten

3

Sie können anonyme Typen nicht einfach weitergeben. Sie können entweder eine Klasse erstellen, oder da Ihre Daten nur zwei Eigenschaften haben, verwenden Sie Tuple :

%Vor%

Wenn die Datentypen korrekt sind, dann wäre der Datentyp des Parameters:

%Vor%

und Sie verweisen auf F und T mit den Tuple Eigenschaften Item1 und Item2 .

    
mellamokb 19.01.2013, 15:40
quelle
8

Sie können die anonymen Datentypen nicht aus einer Methode zurückgeben. Sie können eine Klasse und ein Rückgabeobjekt dieser Klasse aus der Abfrage definieren und an die Zielmethode übergeben.

%Vor%

Sie können das Abfrageergebnis IEnumerable<SomeClass> an die Methode als Parameter übergeben.

%Vor%

Um die Methode aufzurufen, übergeben Sie das Abfrageergebnis ( IEnumerable<SomeClass> ), das in data in diesem Beispielcode gespeichert ist

%Vor%     
Adil 19.01.2013 15:38
quelle
3

1) Nur um das Ergebnis der Abfrage zu übergeben, machen Sie Ihre Funktion generisch, das heißt:

%Vor%

Einfach. Wenn die Verarbeitung in der Methode so einfach ist, reicht dies. Sie können jedoch nicht auf die Eigenschaften F und T innerhalb der Methode zugreifen.

Um dies zu tun:

2) Sie können den Trick "cast by example", der hier von Eric gezeigt wird, verwenden. Um ihn zu zitieren:

  

Wir verwenden Methodentyp-Inferenz und lokale Variablentyp-Inferenz, um zu sagen   der Compiler "diese beiden Dinge sind vom selben Typ". Dies ermöglicht es Ihnen   exportiere einen anonymen Typ als Objekt und wirf ihn zurück in den anonymen Typ.

     

... der Trick funktioniert nur, wenn das Beispiel und die Quellobjekte waren   in Code in derselben Baugruppe erstellt; zwei "identische" anonyme Typen   in zwei verschiedenen Assemblies vereinheitlichen sich nicht zum selben Typ.

%Vor%

Der Haken hier ist, dass SomeMethod jetzt für Ihren anonymen Typ maßgeschneidert ist, da Sie einen bestimmten Typ innerhalb der Methode angeben, also ist es besser, die Funktion nicht generisch zu machen (was Sie tun können) und zu geben ein passender Name für die Funktion.

3) Wenn Funktion jetzt nur für Ihren einzigartigen Typ ist, würde ich sie alle besser in einer einzigen Methode verpacken und überhaupt nicht passieren lassen - keine Hektik! :)

4) Oder Sie können die Aktion an Ihren anonymen Typ delegieren. So würde die Methodensignatur lauten:

%Vor%

Wenn es darauf ankommt, können Sie auch Func delegate haben, indem Sie ein weiteres Argument vom Typ haben.

5) Setzen Sie auf findige Reflektionen, um die Eigenschaften Ihres anonymen Typs zu erhalten.

6) Verwenden Sie das dynamic Schlüsselwort für das Methodenargument und jetzt haben Sie dynamische Typisierung. Beide oben geben Ihnen Vorteile der statischen Eingabe nicht.

7) Sie werden besser eine separate Klasse haben, die F und T enthält. Und das ist das Beste von allem. Aber fragen Sie sich, ob sie zusammen etwas als Einheit darstellen?

8) Falls nicht, übergebe einfach ein IEnumerable<Tuple> oder IDictionary , je nachdem was zählt.

Es hängt alles davon ab, was Sie mit der Methode erreichen wollen. Persönlich würde ich für den Ansatz 2 in einem Hobby-Projekt (für den Spaß beteiligt) gehen, aber in Produktionscode 3, 4, 7, 8 je nach Kontext.

    
nawfal 19.01.2013 15:46
quelle

Tags und Links