için yedek için ... eğer dizi yineleme

oy
7

onlar kısaca bir listesinin bir dönüşüm temsil çünkü Python liste türetimi seviyorum.

Ancak, diğer dillerde, ben sık sık kendimi çizgisinde bir şey yazmaya bulmak:

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

LINQ bu konuda yardım edebilir izlenimi altında değilim nerede Bu örnek, C #, ancak bu yerini alabilir bazı yaygın programlama yapısı biraz orada az daha düzenli bir çözüm? Belki bir veri yapısı ı dikkate değilim?

Oluştur 16/08/2008 saat 21:28
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
-1

Dile bağlıdır ve yapmanız gerekenleri size aradığınızı olabilir birçok dilde denir gibi bir "harita". C # bilmiyorum, ama göre bu sayfada, .NET 2.0 görüşmeleri "ConvertAll" map.

"Map" anlamı oldukça basittir - Yeni bir liste dönen, bir liste almak ve bunun her öğesi için bir işlevi uygular. Ayrıca size başka bir listedeki bir yüklemi tatmin öğelerin listesini verecekti "filtre", arıyor olabilir.

Cevap 16/08/2008 saat 21:37
kaynak kullanıcı

oy
0

Ruby:

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

ya da "diğer işleme" kısa bir liner ise:

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

son olarak, sen 3'ten büyük olanlar unsurların işlenmesi sonuçlarını içeren yeni bir dizi dönmek istiyorsanız:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
Cevap 16/08/2008 saat 21:47
kaynak kullanıcı

oy
1

Python şunlara sahip filtre ve harita istediğiniz yüzden ne,:

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

Orada da liste comprehensions kolay tek deyiminde hem yapabilirsiniz:

[f(x + 1) for x in intArray if x > 3]
Cevap 16/08/2008 saat 21:56
kaynak kullanıcı

oy
2

C # 'böyle bir IEnumerable içinde yaşıyor şey üzerinde seçici işleme uygulayabilirsiniz:

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

Vb..

Cevap 16/08/2008 saat 22:06
kaynak kullanıcı

oy
5

Orijinal içinde artım foreachdizinin içeriğini etkilemez döngü, bunu yapmanın tek yolu kalır fordöngü:

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

Linq mevcut koleksiyon veya sekanslarım değiştirmek için uygun değildir. Bu mevcut olanlar dayalı yeni dizileri oluşturur. Onun amaçları karşı biraz olsa, Linq kullanarak yukarıdaki kodu elde etmek mümkündür:

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

Kullanarak wherediğer bazı yanıtlar gösterildiği gibi (veya eşdeğeri), daha az bir değerleri hariç olacak ya da elde edilen dizisinden 3'e eşittir.

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

Bir yoktur ForEachbunun yerine bir lambda fonksiyonu kullanmak sağlayacak diziler üzerinde yöntem foreachben sopa ile olur bir yöntem çağrısı daha fazla bir şey için olsa da, bloğun foreach.

intArray.ForEach(i => DoSomething(i));
Cevap 16/08/2008 saat 23:44
kaynak kullanıcı

oy
0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Cevap 25/06/2011 saat 10:28
kaynak kullanıcı

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