List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
jQueryで動作するものを試しreturn false;
ましたが、Dartでは動作しません。それを行う方法はありますか?
List data = [1, 2, 3];
data.forEach((value) {
if (value == 2) {
// how to stop?
}
print(value);
});
jQueryで動作するものを試しreturn false;
ましたが、Dartでは動作しません。それを行う方法はありますか?
for / inを使用することもできます。これは、他の回答で適切に示されているイテレータを暗黙的に使用します。
List data = [1,2,3];
for(final i in data){
print('$i');
if (i == 2){
break;
}
}
forEach()とtakeWhile()を使用して例を実装することもできます。
var data = [1, 2, 3];
data.takeWhile((val) => val != 2).forEach(print);
壊す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);
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;
}
}
}
Dartは非ローカルリターンをサポートしていないため、コールバックからのリターンはループを中断しません。jQueryで機能する理由は、each()がコールバックによって返された値をチェックするためです。DartforEachコールバックはvoidを返します。
Greg Loweの投稿に基づいて、私は自分のプロジェクトの場所を使用しました。
var data = [1, 2, 3];
data.where((val) => val != 2).forEach(print);
複数ループの使用
アウターループを破る
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);
}
これは、 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;
}
}
あなたが使用することができ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;
}
誰かが提案しますが、それはブレーク機能を備え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
});
}
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;
}
});