2012-09-25 17 views
15
List data = [1, 2, 3]; 
data.forEach((value) { 
    if (value == 2) { 
    // how to stop? 
    } 
    print(value); 
}); 

jQuery'de çalışan return false;'u denedim ancak Dart'ta çalışmıyor. Bunu yapmanın bir yolu var mı?Dart'ın .forEach() nasıl durdurulur?

+0

"Çalışmıyor" ne anlama geliyor? Aslında ne yapıyor? –

+0

Hiçbir şey yapmıyor. – Leksat

+0

Bunun javascript gibi çalıştığını söylediğinizde jQuery gibi bir kütüphanede mi demek istiyorsunuz? Sorduğum gibi burada açıklanan algoritmanın yanlış bir dönüş değeri üzerinde kırılmadığı anlaşılıyor: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach Dosyalama işlemini düşünün Bu özelliği istiyorsanız hata. –

cevap

16

Ayrıca kullanabileceğiniz bir için/içinde, örtük uygun bir şekilde diğer yanıtında gösterdi yineleyici kullanan:

List data = [1,2,3]; 

for(final i in data){ 
    print('$i'); 
    if (i == 2){ 
    break; 
    } 
} 
+0

aşağıdaki "takeWhile()" çözümü, Dart için daha yeni değişikliklerden yararlanır ve büyük olasılıkla çoğu durumda daha iyi bir çözümdür. Orijinal yanıtı gönderdiğimde –

8

ForEach'ın döndürdüğü geri çağırma, yinelemeyi durdurmak için hiçbir mekanizma olmadığından geri döner.

Bu durumda

Eğer yineleyicinızı kullanarak edilmelidir:

void listIteration() { 
    List data = [1,2,3]; 

    Iterator i = data.iterator(); 

    while (i.hasNext()) { 
    var e = i.next(); 
    print('$e'); 
    if (e == 2) { 
     break; 
    } 
    } 
} 
2

Dart yapar yerel olmayan dönüşleri desteklemez, bu nedenle geri aramadan dönmek döngüyü kırmayacaktır. jQuery'de çalışmasının nedeni, her bir() geri arama tarafından döndürülen değeri kontrol etmesidir. Dart forEach geri çağrısı geçersiz sayılır. Breaking

http://docs.jquery.com/Core/each

7

bir Breaking List

List<int> example = [ 1, 2, 3 ]; 

for (int value in example) { 
    if (value == 2) { 
    break; 
    } 
} 

bir Map

Eğer sadece verilen haritadan bir yineleyici alamayan bir Map dikkatli davranmalıyız, ama sen hala değerlere veya tuşlara uygulayarak for kullanın. Bunu isterseniz [ 'A', 'B', 'C' ] bir LinkedHashMap kullanmak gibi bir Harita mutlaka kişilermişiz anahtarları yok

Map<String, int> example = { 'A': 1, 'B': 2, 'C': 3 }; 

for (String key in example.keys) { 
    if (example[key] == 2 && key == 'B') { 
    break; 
    } 
} 

Not: Bazen her iki anahtar ve değerlerin kombinasyonu gerekebilir beri burada bir örnek verilmiştir. Sadece değerleri istiyorsanız, example.keys yerine example.values yapın. ForEach() ve takeWhile() kullanarak örneğini uygulamak da mümkündür

List<int> example = [ 1, 2, 3 ]; 
int matched = example.firstMatching((e) => e == 2, orElse:() => null); 
11

: Yalnızca bir eleman için arama yapıyorsanız için

Alternatif olarak, her şeyi kolaylaştırabilir.

var data = [1, 2, 3]; 
data.takeWhile((val) => val != 2).forEach(print); 
+0

.takeWhile() çevrede değildi. Çoğu vaka için artık daha uygun ve zarif bir yaklaşım olduğunu söyleyebilirim. –