Array-Operationen mit n-dimensionalen Array mit LINQ (C #)

8

Nehmen wir an, wir haben ein gezacktes Array

%Vor%

Um eine Summe der zweiten Zeile und der Summe der zweiten Spalte zu erhalten, können beide Codezeilen geschrieben werden:

%Vor%

Aber wenn wir die Definition eines zweidimensionalen Arrays haben

%Vor%

Der oben genannte Code funktioniert aufgrund von Compilerfehlern nicht:

%Vor%

Also die Frage: Wie benutzt man LINQ-Methoden mit n-dimensionalen Arrays, aber nicht gezackten? Und wo ist eine Methode zum Konvertieren von rechteckigen Array in gezackt?

P.S. Ich habe versucht, die Antwort in der Dokumentation zu finden, aber ohne Ergebnis.

    
Lev Sharansky 06.09.2011, 11:10
quelle

6 Antworten

15

LINQ to Objects basiert auf IEnumerable & lt; T & gt; Interface , d. H. Eine eindimensionale Folge von Werten. Dies bedeutet, dass es sich nicht gut mit n-dimensionalen Datenstrukturen wie nicht gezackten Arrays vermischt, obwohl dies möglich ist.

Sie können eine eindimensionale Folge von Ganzzahlen erzeugen, die in das n-dimensionale Array indizieren:

%Vor%     
dtb 06.09.2011, 11:20
quelle
3

Über Ihre Frage "Verwendung von LINQ-Methoden mit n-dimensionalen Arrays":

Sie können die meisten LINQ-Methoden nicht mit einem n-dimensionalen Array verwenden, da ein solches Array nur IEnumerable , aber nicht IEnumerable<T> implementiert und die meisten LINQ-Erweiterungsmethoden Erweiterungsmethoden für IEnumerable<T> sind.

Über die andere Frage: Siehe dtb's Antwort.

    
Daniel Hilgarth 06.09.2011 11:21
quelle
3

Um zur Lösung von dtb hinzuzufügen, wäre eine allgemeinere Art der Iteration über alle Elemente des Arrays:

%Vor%

Und jetzt:

%Vor%

Natürlich ist das extrem verschwenderisch, da wir Koordinatentupel selbst für jene Elemente erstellen, die wir am Ende mit Where ausfiltern werden, aber wenn Sie nicht wissen, was die Auswahlkriterien vorher sein werden, ist dies der richtige Weg gehen (oder nicht - das scheint mehr wie eine Übung als etwas, was Sie in der Praxis tun möchten).

Ich kann mir auch vorstellen, wie dies für Arrays mit beliebigem Rang (nicht nur für 2D) mit einem rekursiven Lambda und etwas wie Tuple erweitert werden könnte, das aber in das Masochismus-Territorium übergeht.

    
Jon 06.09.2011 11:23
quelle
1

Das 2D-Array hat keine eingebaute Möglichkeit, über eine Zeile oder Spalte zu iterieren. Es ist nicht allzu schwierig, eine eigene Methode zu erstellen. Sehen Sie sich diese Klasse für eine Implementierung an, die einen Aufzählungswert für Zeile und Spalte erhält.

%Vor%

Sie können das Array auch mit a.Cast<int>() reduzieren, aber Sie würden dann alle Informationen über Spalten / Zeilen verlieren

    
ForbesLindesay 06.09.2011 11:25
quelle
0

Ein einfacherer Weg ist wie folgt

%Vor%     
Chris Cooper 27.11.2015 15:04
quelle
-1

Der einfachste LINQ-Ansatz, den ich sehen kann, um diese Art von Zeilen- und Spaltenoperationen in einem zweidimensionalen Array auszuführen, besteht darin, die folgenden Lookups zu definieren:

%Vor%

Jetzt können Sie das einfach tun:

%Vor%

Wie für n-dimensional wird es einfach zu schmerzhaft ... Entschuldigung.

    
Enigmativity 06.09.2011 11:39
quelle

Tags und Links