Ich weiß, wie man das mit for-Schleifen macht. Ist es möglich, etwas wie dies mit LINQ oder Lambdas zu tun?
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a * b; //resulting array should be { 20, 80, 300 }
Ich weiß, wie man das mit for-Schleifen macht. Ist es möglich, etwas wie dies mit LINQ oder Lambdas zu tun?
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a * b; //resulting array should be { 20, 80, 300 }
EDIT: Der Code unten wird funktionieren, aber es ist nicht so lesbar wie mit einer expliziten Methode. LINQ ist großartig, wo es definitiv fügt hinzu. zur Lesbarkeit... aber dies ist keiner dieser Fälle.
Dies ist eine gekürzte Fassung der CMS-Antwort - das Extra let
ist nicht erforderlich, und wenn man nur eine Projektion durchführt, ist es einfacher, einfach die Punktnotation zu verwenden:
int[] result = Enumerable.Range(0, a.Length)
.Select(i => a[i] * b[i])
.ToArray();
Eine Alternative ist die Verwendung der Form von Select, die einen Index annimmt:
int[] result = a.Select((value, index) => value * b[index])
.ToArray();
Verwendung der Zip-Funktion (neu in .NET 4.0) Details aquí :
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a.Zip(b, (a1, b1) => a1 * b1).ToArray();
Bis zum Erscheinen von .NET 4 können Sie die Zip-Implementierung unter dem obigen Link verwenden.
Sie können so vorgehen:
int[] a = {10, 20, 30};
int[] b = {2, 4, 10};
if (a.Length == b.Length)
{
int[] result = (from i in Enumerable.Range(0, a.Length)
let operation = a[i]*b[i]
select operation).ToArray();
}
Aber ich empfehle Ihnen, wenn Sie mit Matrizen und fortgeschritteneren mathematischen Themen arbeiten wollen, eine gute Mathe-Bibliothek zu kaufen, wie z.B. NMath oder suchen Sie nach einem Matrix-Klasse Umsetzung, es gibt viele da draußen...
Es ist nichts eingebaut, aber Sie können jederzeit Ihre eigenen Funktionen schreiben. Die erste unten ist eine einfache Erweiterungsmethode, die tut, was Sie wollen. Die zweite ermöglicht es Ihnen, die anzuwendende Funktion anzugeben:
class Program
{
public static void Main(string[] args)
{
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a.MatrixMultiply(b);
int[] c2 = a.Zip(b, (p1, p2) => p1 * p2);
}
}
public static class Extension
{
public static int[] MatrixMultiply(this int[] a, int[] b)
{
// TODO: Add guard conditions
int[] c = new int[a.Length];
for (int x = 0; x < a.Length; x++)
{
c[x] = a[x] * b[x];
}
return c;
}
public static R[] Zip<A, B, R>(this A[] a, B[] b, Func<A, B, R> func)
{
// TODO: Add guard conditions
R[] result = new R[a.Length];
for (int x = 0; x < a.Length; x++)
{
result[x] = func(a[x], b[x]);
}
return result;
}
}
Sehen Sie sich das an MSDN-Artikel über das kommende PLINQ (Parallel LINQ). In dem Artikel finden Sie ein Beispiel für die Verwendung von PLINQ zur Parallelisierung der Matrixmultiplikation:
void ParMatrixMult(int size, double[,] m1, double[,] m2, double[,] result)
{
Parallel.For( 0, size, delegate(int i) {
for (int j = 0; j < size; j++) {
result[i, j] = 0;
for (int k = 0; k < size; k++) {
result[i, j] += m1[i, k] * m2[k, j];
}
}
});
}
Es verwendet LINQ und ein Lambda! Und als Bonus ist sie auf mehrere Prozessoren verteilt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
0 Stimmen
Aber warum sollten Sie überhaupt LINQ verwenden? Was ist falsch an einer vertrauten "for-Schleife", die jeder verstehen kann?
0 Stimmen
...oder verwenden Sie einfach eine Matrix-Klassenbibliothek...
0 Stimmen
Lustigerweise habe ich beantwortete heute eine weitere Frage der die Zahlen in zwei Reihenfolgen summiert.