Frage

Ich Liebe Liste Verstehens in Python, weil Sie prägnant dar transformation einer Liste.

Jedoch, in den anderen Sprachen, die ich Häufig selbst schreiben, etwas entlang der Linien von:

foreach (int x in intArray)
  if (x > 3) //generic condition on x
    x++ 
    //do other processing

Dieses Beispiel ist in C#, wo ich bin unter dem Eindruck, LINQ kann mit Hilfe dieser, aber gibt es einige Allgemeine Programmierung Konstrukt, welches ersetzen kann, das etwas weniger als elegante Lösung?Vielleicht eine Daten-Struktur, die ich bin nicht in Betracht?

War es hilfreich?

Lösung

Der Zuwachs in der original - foreach die Schleife wird nicht Einfluss auf den Inhalt des Arrays, der einzige Weg, dies zu tun, bleibt ein for loop:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) ++intArray[i];
}

Linq ist nicht beabsichtigt, zu ändern vorhandener Sammlungen oder Sequenzen.Es schafft neue Sequenzen basierend auf bestehenden.Ist es möglich zu erreichen, den obigen code mit Linq, obwohl es leicht gegen seine Zwecke genutzt werden:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

Verwendung where (oder gleichwertig), wie gezeigt in einigen der anderen Antworten, schließt alle Werte, die kleiner oder gleich 3 aus der resultierenden Sequenz.

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

Es ist ein ForEach Methode für arrays, die Ihnen erlauben, verwenden Sie eine lambda-Funktion statt einer foreach block, obwohl es für etwas mehr als eine Methode nennen, ich würde stick mit foreach.

intArray.ForEach(i => DoSomething(i));

Andere Tipps

In C# können Sie anwenden, selektive Verarbeitung auf alles, was lebt in einem IEnumerable wie diese:

intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));

Etc..

In Python, die Sie haben filter und Karte,, die können also, was Sie wollen:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))

Es gibt auch Liste Verstehens das kann sowohl in einer einfachen Aussage:

[f(x + 1) for x in intArray if x > 3]

in Ruby:

intArray.select { |x| x > 3 }.each do |x|
  # do other processing
end

oder wenn "andere Verarbeitung" ist nur einen kurzen Einzeiler:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x }

schließlich, wenn Sie wollen zurückkehren, ein neues array mit den Ergebnissen der Verarbeitung dieser Elemente größer als 3 ist:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))

Hängt von der Sprache und dem, was Sie tun müssen, ist, eine "Landkarte", wie es heißt, in vielen Sprachen sein könnte, was Sie suchen.Ich weiß nicht C#, aber nach diese Seite .NET 2.0 Anrufe anzeigen "ConvertAll".

Die Bedeutung von "Karte" ist ziemlich einfach - nehmen Sie eine Liste und anwenden einer Funktion auf jedes element der, nach einer neuen Liste.Sie können auch suchen für "filter", die würde geben Sie eine Liste der Elemente, die ein Prädikat erfüllen, die in einer anderen Liste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top