74
List data = [1, 2, 3];
data.forEach((value) {
  if (value == 2) {
    // how to stop?
  }
  print(value);
});

jQueryで動作するものを試しreturn false;ましたが、Dartでは動作しません。それを行う方法はありますか?

4

11 に答える 11

112

for / inを使用することもできます。これは、他の回答で適切に示されているイテレータを暗黙的に使用します。

List data = [1,2,3];

for(final i in data){
  print('$i');
  if (i == 2){
    break;
  }
}
于 2012-09-25T16:54:17.100 に答える
46

forEach()とtakeWhile()を使用して例を実装することもできます。

var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
于 2013-11-18T19:49:53.403 に答える
22

壊すList

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

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

壊すMap

を扱っているMap場合、指定されたマップからイテレータを単純に取得することはできませんがfor、値またはキーのいずれかに適用することで、イテレータを使用できます。キーと値の両方の組み合わせが必要になる場合があるため、次に例を示します。

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

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

[ 'A', 'B', 'C' ]必要に応じて、LinkedHashMapを使用するため、マップに必ずしもキーがあるとは限らないことに注意してください。値だけが必要な場合は、のexample.values代わりに実行してくださいexample.keys

または、要素のみを検索する場合は、すべてを次のように簡略化できます。

List<int> example = [ 1, 2, 3 ];
int matched = example.firstMatching((e) => e == 2, orElse: () => null);
于 2013-02-05T14:40:35.713 に答える
16

forEachが取るコールバックはvoidを返すため、反復を停止するメカニズムはありません。

この場合、イテレータを使用する必要があります。

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

  Iterator i = data.iterator;

  while (i.moveNext()) {
    var e = i.current;
    print('$e');
    if (e == 2) {
      break;
    }
  }
}
于 2012-09-25T16:39:51.363 に答える
5

Dartは非ローカルリターンをサポートしていないため、コールバックからのリターンはループを中断しません。jQueryで機能する理由は、each()がコールバックによって返された値をチェックするためです。DartforEachコールバックはvoidを返します。

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

于 2012-09-26T09:35:26.850 に答える
3

Greg Loweの投稿に基づいて、私は自分のプロジェクトの場所を使用しました。

var data = [1, 2, 3];
data.where((val) => val != 2).forEach(print);
于 2019-06-12T08:51:44.593 に答える
1

複数ループの使用

アウターループを破る

OUTER: for (var i = 0; i < m.length; i++) {
  for (var j = 0; j < m[i].length; j++) {
    if (m[i][j] < 0) {
      print("Negative value found at $i,$j: ${m[i][j]}");
      break OUTER;
    }
  }
}

アウターループを続ける

  outer: for (var v in a) {
    for (var w in b) {
      if (w == v) continue outer;
    }
    print(v);
  }
于 2020-04-25T13:58:44.607 に答える
0

これは、 forEachスタイルに近いfor-inループによる完全なサンプルです。

void main(){
  var myList = [12, 18, 24, 63, 84,99];

  myList.forEach((element) {
   print(element);
   if (element ==24); //break; // does not work
  });

 for(var element in myList) {
    print(element);
    if (element==24) break;
   } 
} 
于 2020-05-25T06:57:41.227 に答える
0

あなたが使用することができforますindexOf

 for (var number in id) {
    var index = id.indexOf(number);

    print('Origin forEach loop');

    for (int i = 0; i < 1; i++) {
      print("for loop");
    }

    break;
  }
于 2020-10-22T06:14:13.637 に答える
0

誰かが提案しますが、それはブレーク機能を備えwhere()た一般的な代替品ではありませんforEach()

whereただし、質問の例に示されているユースケースの正しい代替品です。一方、私はタイトルの質問に焦点を当てています)

foreach()、と同等の機能は次のようbreakに与えられany()ます。ループを続行するにはfalseを返し、停止するにはtrueを返します。any()の結果は無視できます。私はそれがeach()jqueryの方に似ていると思います(しかし、dartではあなたがtrueを返すのを止めます)。

インデックスを使用してループを作成するだけでなく、ループを解除する可能性を持たせるために、次の拡張機能を使用します。

extension IterableUtils<E> on Iterable<E> {

  /**
    Similar to Iterable.forEach() but:
    - with an index argument
    - with the optional capacity to break the loop, returning false
      Note: as for the return clause, you can omit it, as with forEach()
   */
  void forEachIndexed(Function(E element, int index) f) {
    int index = 0;
    for (E element in this) {
      if (f(element, index) == false) break;
      index++;
    }
  }
}

例:

void main() {

  List list = ["a", "b", "c"];

  list.forEachIndexed((element, index) {
    print("$index: $element");

    //Optional:
    if (element == "b") return false; //break
  });
}
于 2021-04-08T11:19:44.843 に答える
0

forEachからのリターンを空にして、ループを中断することができます。

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

data.forEach((value) {
  if (value == 2) {
    _valueToBePrinted = value;
    return;
  }
});
// you can return something here to
// return _valueToBePrinted;
print(value);

とにかくあなたはすべきではありません...

キャッチは、forEachループ全体で何も返すことができないということです

//This don't work
data.forEach((value) {
  if (value == 2) {
    _valueToBePrinted = value;
    return;
  }
  if (value == 1) {
   return value;
  }
});
于 2021-06-16T18:17:04.400 に答える