Die Auswahl von Elementen aus dem array nach Indizes angegeben, die in einem anderen array c#
Angenommen wir haben ein array mit Daten:
double[] x = new double[N] {x_1, ..., x_N};
Array der Größe N
mit Etiketten entsprechend der Elemente der x
:
int[] ind = new int[N] {i_1, ..., i_N};
Was ist der Schnellste Weg, um wählen Sie alle Elemente aus x
bestimmten label I
nach ind
?
Beispielsweise
x = {3, 2, 6, 2, 5}
ind = {1, 2, 1, 1, 2}
I = ind[0] = 1
Ergebnis:
y = {3, 6, 2}
Klar, es kann leicht sein (aber nicht effizient und sauber) gemacht mit Schleifen, aber ich denke, es sollte die Art und Weise, wie zu tun, dass die Verwendung .Where
und lambdas..Danke
EDIT:
Die Antwort MarcinJuraszek ist völlig richtig, vielen Dank. Allerdings habe ich vereinfacht, die Frage in der Hoffnung, dass es funktionieren würde, in meine ursprüngliche Lage. Könnten Sie bitte schauen, was ist das problem, wenn wir generische Typen:
T1[] xn = new T1[N] {x_1, ..., x_N};
T2[] ind = new T2[N] {i_1, ..., i_N};
T2 I = ind[0]
Mit der Lösung bekomme ich die Fehlermeldung "Delegat" System.Func "nicht 2 Argumente":
T1[] y = xn.Where((x, idx) => ind[idx] == I).ToArray();
Vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wärs damit:
Verwendet er die zweite, weniger populäre,
Where
überlast:Enumerable.Wo<TSource>(IEnumerable<TSource> Func<TSource, Int32, Boolean>)
die posten index zur Verfügung als Prädikat parameter (genannt
idx
in meiner Lösung).Generische version
Nutzung
Generic +
double
versionT2 == T2
(oderT2.Equals(T2)
) definiert ist, fügen Sie generische Einschränkungwhere T2 : IEquatable
xs
istT1
undind
istT2
undresults
istT2
es sagt, dass "Der Typ T2 nicht verwendet werden kann als Typ-parameter... keine boxing-Konvertierung oder-Typ parameter Konvertierungs-aus T2-System.IEquatable<T2>". Ich weiß, dass ich;m etwas falsch, deine Antwort ist toll. Ich würde schätzen Hilfe, wenn Sie könnenT2
nicht implementiertIEquatable<>
. Implementieren es, und es ist gonna Arbeit.T2
hättedouble
Art immer. Gibt es eine Möglichkeit, wie Sie angeben, dass das array istdouble[]
bei der übergabeind
zuWhereCorresponding
?Dies ist eine klassische Verwendung für Enumerable.Zip, das läuft über zwei enumerables parallel zu einander. Mit Zip können Sie Ihre Ergebnisse mit nur einem pass. Das folgende ist komplett Typ-agnostischen, obwohl ich verwenden Sie
int
s undstring
s zur illustration: