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.
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%Ü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.
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.
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
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.