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)
小智 12
也许更一致〜
var list = []..addAll(list1)..addAll(list2);
Run Code Online (Sandbox Code Playgroud)
Erl*_*end 11
Dart 现在支持使用+
运算符连接列表。
例子:
List<int> result = [0, 1, 2] + [3, 4, 5];
Run Code Online (Sandbox Code Playgroud)
Nut*_*uts 11
如果要合并两个列表并删除重复项可以执行以下操作:
var newList = [...list1, ...list2].toSet().toList();
Run Code Online (Sandbox Code Playgroud)
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)
已验证 :)
我收集所有可能的方法并使用 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)
如果您的列表之一可为空,请使用...?
运算符:
var newList = [
...?list1,
...?list2,
...?list3,
];
Run Code Online (Sandbox Code Playgroud)
如果您还想删除列表中的重复项目:
var newList = {
...?list1,
...?list2,
...?list3,
}.toList();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19261 次 |
最近记录: |