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

我尝试return false;了哪个在 jQuery 中有效,但在 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

如果您正在处理 a Map,您不能简单地从给定的映射中获取迭代器,但您仍然可以for通过将 a 应用于值或键来使用它。由于您有时可能需要键和值的组合,因此这里有一个示例:

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

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

请注意,如果您需要, Map 不一定具有[ '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() 检查回调返回的值。Dart forEach 回调返回 void。

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

于 2012-09-26T09:35:26.850 回答
3

根据 Greg Lowe 的帖子,我在项目中使用了 where 并且它也有效。

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

这是for-in循环的完整示例,接近forEach样式。

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

您可以使用forindexOf

 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 回答