replaceRange method
Replaces a range of elements with the elements of replacement
.
Removes the objects in the range from start
to end
, then inserts the elements of replacements
at start
.
var list = [1, 2, 3, 4, 5]; list.replaceRange(1, 4, [6, 7]); list.join(', '); // '1, 6, 7, 5'
The provided range, given by start
and end
, must be valid. A range from start
to end
is valid if 0 ≤ start
≤ end
≤ length. An empty range (with end == start
) is valid.
The operation list.replaceRange(start, end, replacements)
is roughly equivalent to:
list.removeRange(start, end); list.insertAll(start, replacements);
but may be more efficient.
The list must be growable. This method does not work on fixed-length lists, even when replacement
has the same number of elements as the replaced range. In that case use setRange instead.
Implementation
void replaceRange(int start, int end, Iterable<E> newContents) { RangeError.checkValidRange(start, end, this.length); if (start == this.length) { addAll(newContents); return; } if (newContents is! EfficientLengthIterable) { newContents = newContents.toList(); } int removeLength = end - start; int insertLength = newContents.length; if (removeLength >= insertLength) { int insertEnd = start + insertLength; this.setRange(start, insertEnd, newContents); if (removeLength > insertLength) { _closeGap(insertEnd, end); } } else if (end == this.length) { int i = start; for (E element in newContents) { if (i < end) { this[i] = element; } else { add(element); } i++; } } else { int delta = insertLength - removeLength; int oldLength = this.length; int insertEnd = start + insertLength; // aka. end + delta. for (int i = oldLength - delta; i < oldLength; ++i) { add(this[i > 0 ? i : 0]); } if (insertEnd < oldLength) { this.setRange(insertEnd, oldLength, this, end); } this.setRange(start, insertEnd, newContents); } }
© 2012 the Dart project authors
Licensed under the Creative Commons Attribution-ShareAlike License v4.0.
https://api.dart.dev/stable/2.13.0/dart-collection/ListMixin/replaceRange.html