Náhrada za ... pokud pole iterace

hlasů
7

Miluji list comprehension v Pythonu, protože stručně představují transformaci seznamu.

Nicméně, v jiných jazycích, často jsem se ocitl psát něco v duchu:

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

Tento příklad je v C #, kde jsem si pod dojmem LINQ může pomoci s tím, ale je tam nějaký společný programovací konstrukt, který může nahradit tento o něco méně než elegantní řešení? Možná, že datová struktura nejsem zvažuje?

Položena 16/08/2008 v 23:28
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
5

Přírůstek v původním foreachsmyčce nebude mít vliv na obsah pole, jediný způsob, jak to udělat, zůstává forloop:

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

Linq není určen k úpravě stávajících kolekcí nebo sekvence. Vytváří nové sekvence na základě stávajících. Je možné dosáhnout výše uvedený kód pomocí LINQ, i když je to trochu proti své účely:

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

Použití where(nebo jeho ekvivalentu), jak je uvedeno v některé z dalších odpovědí, vyloučí všechny hodnoty menší než nebo roven 3 z výsledné sekvence.

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

Tam je ForEachmetoda na pole, které vám umožní používat funkci lambda místo foreachbloku, ale nic víc než volání metody bych držet se foreach.

intArray.ForEach(i => DoSomething(i));
Odpovězeno 17/08/2008 v 01:44
zdroj uživatelem

hlasů
2

V C # můžete použít selektivní zpracování na cokoliv, co žije uvnitř IEnumerable takto:

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

Atd..

Odpovězeno 17/08/2008 v 00:06
zdroj uživatelem

hlasů
1

Python, máte filtr a mapy , které mohou takže to, co chcete:

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

K dispozici je také seznam comprehension který může dělat obojí v jednom snadném prohlášení:

[f(x + 1) for x in intArray if x > 3]
Odpovězeno 16/08/2008 v 23:56
zdroj uživatelem

hlasů
0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Odpovězeno 25/06/2011 v 12:28
zdroj uživatelem

hlasů
0

Ruby:

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

nebo je-li „další zpracování“ je krátký jednořádkový:

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

A konečně, pokud se chcete vrátit nové pole obsahující výsledky zpracování těchto prvků větší než 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
Odpovězeno 16/08/2008 v 23:47
zdroj uživatelem

hlasů
-1

Závisí na jazyku, a to, co je třeba udělat, „mapu“, jak se tomu říká v mnoha jazycích by mohlo být to, co hledáte. Nevím, C #, ale podle této stránky, map .NET 2.0 volání „ConvertAll“.

Význam „mapa“ je velmi jednoduchá - vzít seznam a použít funkci pro každý prvek ní vrací nový seznam. Můžete být také hledá „filtr“, který by vám seznam položek, které vyhovují predikátu v jiném seznamu.

Odpovězeno 16/08/2008 v 23:37
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more