Ersatz für..., wenn array-iteration
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?
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.