如何在 Dart 中组合两个列表?

我想知道是否有一种简单的方法来连接两个在省道列表创建一个全新的列表对象。我找不到像这样的东西:

我的清单:

list1 = [1, 2, 3]
list2 = [4, 5, 6]

我试过:

var newList = list1 + list2;

我想要的结合输出:

[1, 2, 3, 4, 5, 6]
120581 次浏览

你可使用:

var newList = new List.from(list1)..addAll(list2);

如果你有几个列表,你可以使用:

var newList = [list1, list2, list3].expand((x) => x).toList()

从 Dart 2开始,你现在可以使用 +:

var newList = list1 + list2 + list3;

在 Dart 2.3中,你可以使用扩展运算符:

var newList = [...list1, ...list2, ...list3];

Alexandres 的回答是最好的,但是如果你想使用 + 就像你的例子一样,你可以使用飞镖运算符重载:

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
}
}

然后:

var newMyList = myList1 + myList2;

有效期:)

也许更一致 ~

var list = []..addAll(list1)..addAll(list2);

Dart now 使用 +操作符对列表进行 支撑物串联。

例如:

List<int> result = [0, 1, 2] + [3, 4, 5];

如果要合并两个列表并删除重复的列表,可以这样做:

var newList = [...list1, ...list2].toSet().toList();

在我看来,没必要再列第三个名单了。

用这个:

list1 = [1, 2, 3];
list2 = [4, 5, 6];
list1.addAll(list2);


print(list1);
// [1, 2, 3, 4, 5, 6] // is our final result!

addAll是合并两个列表最常用的方法。

但是要连接列表列表,您可以使用以下三个函数中的任何一个(下面的例子) :

void main() {
List<int> a = [1,2,3];
List<int> b = [4,5];
List<int> c = [6];
List<List<int>> abc = [a,b,c]; // list of lists: [ [1,2,3], [4,5], [6] ]
List<int> ints = abc.expand((x) => x).toList();
List<int> ints2 = abc.reduce((list1,list2) => list1 + list2);
List<int> ints3 = abc.fold([], (prev, curr) => prev + curr); // initial value is []
print(ints);  // [1,2,3,4,5,6]
print(ints2); // [1,2,3,4,5,6]
print(ints3); // [1,2,3,4,5,6]
}
 list1.followedBy(list2).toList();

对于 Dart 2.3 + 和 JavaScript社区的人:

var mergedList = [...listX, ...listY, ...listZ].toSet();

toSet()将只过滤和返回唯一的项目。

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

根据结果,建议的方法是:

  • 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();
}

结果就是:

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.


还有一个:

import 'package:collection/collection.dart';


final x = [1, 2, 3];
final y = [4, 5, 6];
final z = [x, y].flattened // Iterable<int>
final result = z.toList();

请注意,flattened被定义为 Iterable<Iterable<T>>上的扩展,因此也可以与其他迭代器一起工作。

如果列表中的一个可以为空,请使用 ...?操作符:

var newList = [
...?list1,
...?list2,
...?list3,
];

如果还要删除列表中的重复项:

var newList = {
...?list1,
...?list2,
...?list3,
}.toList();