setRange 方法
override
将 iterable 中的一些元素写入此列表的范围。
跳过 skipCount
个对象后,将 iterable
的对象复制到从 start
(包含)到 end
(不包含)的此列表范围。
final list1 = <int>[1, 2, 3, 4];
final list2 = <int>[5, 6, 7, 8, 9];
// Copies the 4th and 5th items in list2 as the 2nd and 3rd items
// of list1.
const skipCount = 3;
list1.setRange(1, 3, list2, skipCount);
print(list1); // [1, 8, 9, 4]
提供的范围,由 start
和 end
给出,必须有效。如果 0 ≤ start
≤ end
≤ length,则从 start
到 end
的范围有效。空范围(end == start
)是有效的。
在跳过 skipCount
个对象后,iterable
必须有足够的对象来填充从 start
到 end
的范围。
如果 iterable
是此列表,则该操作正确地将从 skipCount
到 skipCount + (end - start)
的原始范围元素复制到从 start
到 end
的范围,即使这两个范围重叠。
如果 iterable
以某种方式依赖于此列表,则不提供任何保证。
实现
void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
RangeError.checkValidRange(start, end, this.length);
int length = end - start;
if (length == 0) return;
RangeError.checkNotNegative(skipCount, "skipCount");
List<E> otherList;
int otherStart;
// TODO(floitsch): Make this accept more.
if (iterable is List<E>) {
otherList = iterable;
otherStart = skipCount;
} else {
otherList = iterable.skip(skipCount).toList(growable: false);
otherStart = 0;
}
if (otherStart + length > otherList.length) {
throw IterableElementError.tooFew();
}
if (otherStart < start) {
// Copy backwards to ensure correct copy if [from] is this.
for (int i = length - 1; i >= 0; i--) {
this[start + i] = otherList[otherStart + i];
}
} else {
for (int i = 0; i < length; i++) {
this[start + i] = otherList[otherStart + i];
}
}
}