setRange 方法

void setRange(
  1. int start,
  2. int end,
  3. Iterable<E> iterable,
  4. [int skipCount = 0]
)
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]

提供的范围,通过 startend 给出,必须是有效的。如果 0 ≤ startendlength,则范围从 startend 是有效的。一个空范围(end == start)是有效的。

iterable 必须有足够数量的对象来填充从 startend 的范围(在跳过 skipCount 个对象之后)。

如果 iterable 是此列表,则操作会正确地将原始范围从 skipCountskipCount + (end - start) 的元素复制到 startend 的范围,即使这两个范围有重叠。

如果 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];
    }
  }
}