有没有一种简单的方法可以在Dart中组合两个列表?

Ale*_*lex 37 generics list dart

我想知道是否有一种简单的方法可以在dart中组合两个列表来创建一个全新的列表对象.我找不到任何类似的东西:

var newList = list1 + list2;
Run Code Online (Sandbox Code Playgroud)

无效.

Ale*_*uin 81

您可以使用:

var newList = new List.from(list1)..addAll(list2);
Run Code Online (Sandbox Code Playgroud)

如果您有多个列表,您可以使用:

var newList = [list1, list2, list3].expand((x) => x).toList()
Run Code Online (Sandbox Code Playgroud)

  • 另一种方法(允许轻松连接多个列表):`[list1,list2,list3,...].expand((x)=> x).toList()`; (18认同)
  • 请注意,“+”运算符不能用于不同类型的列表。(在这种情况下,您会收到类似“type 'List<Widget>' is not a subtype of type 'List<Image>'”之类的错误。)。不过,扩展运算符非常适合此用例。 (2认同)

小智 12

也许更一致〜

var list = []..addAll(list1)..addAll(list2);
Run Code Online (Sandbox Code Playgroud)

  • 老我知道,但是 `..addAll()` 是什么,为什么不只是一个点? (2认同)
  • @ Abbas.M ..用于链接,要消除双点,您必须:list = []; list.addAll(list1); list.addAll(list2); 从我的角度来看,它基本上意味着调用此函数,但是忽略它返回的内容,并继续对我们正在操作的对象进行操作。 (2认同)

Erl*_*end 11

Dart 现在支持使用+运算符连接列表。

例子:

List<int> result = [0, 1, 2] + [3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

  • 这是最新的答案 (2认同)

Nut*_*uts 11

如果要合并两个列表并删除重复项可以执行以下操作:

var newList = [...list1, ...list2].toSet().toList(); 
Run Code Online (Sandbox Code Playgroud)

  • `var newList = {...list1, ...list2}.toList();` (5认同)

Dan*_*son 9

Alexandres的回答是最好的,但是如果你想在你的例子中使用+ like,你可以使用Darts运算符重载:

class MyList<T>{
  List<T> _internal = new List<T>();
  operator +(other) => new List<T>.from(_internal)..addAll(other);
  noSuchMethod(inv){
    //pass all calls to _internal
  }
}
Run Code Online (Sandbox Code Playgroud)

然后:

var newMyList = myList1 + myList2;
Run Code Online (Sandbox Code Playgroud)

已验证 :)


naf*_*aka 7

我收集所有可能的方法并使用 benchmark_harness 包对其进行基准测试。

根据结果​​推荐的方法是:

  • final List<int> c = a + b;
  • final List<int> c = [...a, ...b];

这是基准代码:

import 'package:benchmark_harness/benchmark_harness.dart';

List<int> a = [1, 2, 3];
List<int> b = [4, 5, 6];

class Benchmark1 extends BenchmarkBase {
  const Benchmark1() : super('c = a + b ');

  @override
  void run() {
    final List<int> c = a + b;
  }
}

class Benchmark2 extends BenchmarkBase {
  const Benchmark2() : super('c = a.followedBy(b).toList() ');

  @override
  void run() {
    final List<int> c = a.followedBy(b).toList();
  }
}

class Benchmark3 extends BenchmarkBase {
  const Benchmark3() : super('c = [a, b].expand((x) => x).toList() ');

  @override
  void run() {
    final List<int> c = [a, b].expand((x) => x).toList();
  }
}

class Benchmark4 extends BenchmarkBase {
  const Benchmark4() : super('c = [a, b].reduce((value, element) => value + element) ');

  @override
  void run() {
    final List<int> c = [a, b].reduce((value, element) => value + element);
  }
}

class Benchmark5 extends BenchmarkBase {
  const Benchmark5() : super('c = [a, b].fold([], (previousValue, element) => previousValue + element) ');

  @override
  void run() {
    final List<int> c = [a, b].fold([], (previousValue, element) => previousValue + element);
  }
}

class Benchmark6 extends BenchmarkBase {
  const Benchmark6() : super('a.addAll(b) ');

  @override
  void run() {
    a.addAll(b);
  }
}

class Benchmark7 extends BenchmarkBase {
  const Benchmark7() : super('c = <int>[...a, ...b] ');

  @override
  void run() {
    final List<int> c = <int>[...a, ...b];
  }
}

class Benchmark8 extends BenchmarkBase {
  const Benchmark8() : super('c = List.from(a)..addAll(b) ');

  @override
  void run() {
    final List<int> c = List.from(a)..addAll(b);
  }
}

void main() {
  // Benchmark1().report();
  // Benchmark2().report();
  // Benchmark3().report();
  // Benchmark4().report();
  // Benchmark5().report();
  // Benchmark6().report();
  // Benchmark7().report();
  Benchmark8().report();
}
Run Code Online (Sandbox Code Playgroud)

结果:

c = a + b (RunTime): 0.8384643860155879 us.
c = a.followedBy(b).toList() (RunTime): 1.3018350015264015 us.
c = [a, b].expand((x) => x).toList() (RunTime): 2.194391139053011 us.
c = [a, b].reduce((value, element) => value + element) (RunTime): 1.1215188056273329 us.
c = [a, b].fold([], (previousValue, element) => previousValue + element) (RunTime): 1.7163271628511283 us.
a.addAll(b) (RunTime): 1.08603684815237 us.
c = <int>[...a, ...b] (RunTime): 0.8498483658053312 us.
c = List.from(a)..addAll(b) (RunTime): 0.9107294347150762 us.

Run Code Online (Sandbox Code Playgroud)


iDe*_*ode 5

如果您的列表之一可为空,请使用...?运算符:

var newList = [
  ...?list1,
  ...?list2,
  ...?list3,
];
Run Code Online (Sandbox Code Playgroud)

如果您还想删除列表中的重复项目:

var newList = {
  ...?list1,
  ...?list2,
  ...?list3,
}.toList();
Run Code Online (Sandbox Code Playgroud)