从dart中的另一个列表中删除列表

从dart中的另一个列表中删除列表,dart,Dart,我有两个列表,lst1和lst2。我想执行lst1-lst2,它返回lst1的所有元素,而不是lst2 var lst1 = ["t1" , "t2" , "t3" , "t4"]; var lst2 = ["t2" , "t4" , "t5"]; //output: ["t1" , "t3"] 转换为集合并获取差异,然后转换回列表(注意,不会保留重复项或元素顺序): 输出 [t1, t3] 使用建议的集合的方法可能是最快的,但如果您的第一个列表包含要保留的重复项,集合将完全销毁它们 相反,

我有两个列表,
lst1
lst2
。我想执行
lst1-lst2
,它返回
lst1
的所有元素,而不是
lst2

var lst1 = ["t1" , "t2" , "t3" , "t4"];
var lst2 = ["t2" , "t4" , "t5"];
//output: ["t1" , "t3"]

转换为集合并获取差异,然后转换回列表(注意,不会保留重复项或元素顺序):

输出

[t1, t3]

使用建议的集合的方法可能是最快的,但如果您的第一个列表包含要保留的重复项,集合将完全销毁它们

相反,您可以使用简单的列表过滤方法

void main(){
var lst1=[“t1”、“t2”、“t2”、“t3”、“t3”、“t4”];//引入重复项
变量lst2=[“t2”、“t4”、“t5”];
var set1=设置自(lst1);
var set2=从(lst2)开始设置;
打印(列表.起始(set1.差异(set2));
//输出:[t1,t3]
var filtered_lst=List.from(lst1.where(
(值)=>!lst2.contains(值));
打印(已过滤);
//输出:[t1、t3、t3]
}
如果两个列表中都有重复项,并且您确实希望减去每个项目的列表项,则可以使用
删除
方法(警告:这实际上会从第一个列表中删除项目,因此您可能需要先创建副本)

void main(){
var lst1=[“t1”、“t2”、“t2”、“t3”、“t3”、“t4”];//引入重复项
变量lst2=[“t2”、“t4”、“t5”];
用于(lst2中的var元素){
lst1.移除(elem);
}
打印(lst1);
//输出:[t1、t2、t3、t3]
//只有一次出现的“t2”被删除。
}

如果您希望以非破坏性的方式执行此操作并保留顺序,您可以为此创建一个Iterable扩展

void main() {
  final lst1 = ["t1" , "t2" , "t3" , "t4"];
  final lst2 = ["t2" , "t4" , "t5"];
  final diff = lst1.whereNotIn(lst2).toList();
  print(diff);
}

extension WhereNotInExt<T> on Iterable<T> {
  Iterable<T> whereNotIn(Iterable<T> reject) {
    final rejectSet = reject.toSet();
    return where((el) => !rejectSet.contains(el));
  }
}
void main(){
最终lst1=[“t1”、“t2”、“t3”、“t4”];
最终lst2=[“t2”、“t4”、“t5”];
最终差异=lst1.whereNotIn(lst2.toList();
打印(差异);
}
不可定义的扩展{
Iterable whereNotIn(Iterable拒绝){
最终拒绝集=拒绝.toSet();
返回其中((el)=>!rejectSet.contains(el));
}
}
在这里尝试一下:

这种方法的一些好处:

  • 不会改变原始列表
  • 保留原始顺序
  • 也适用于Iterable
  • 它使用一个集合来跟踪要拒绝的元素,因此如果两个列表都很大,它不会慢很多

ooh好的,如果需要保留副本并保留顺序,您的答案会更好。根据集合的性质,我假设无法保证保持顺序。事实上,我更新了答案。谢谢你。
void main() {
  final lst1 = ["t1" , "t2" , "t3" , "t4"];
  final lst2 = ["t2" , "t4" , "t5"];
  final diff = lst1.whereNotIn(lst2).toList();
  print(diff);
}

extension WhereNotInExt<T> on Iterable<T> {
  Iterable<T> whereNotIn(Iterable<T> reject) {
    final rejectSet = reject.toSet();
    return where((el) => !rejectSet.contains(el));
  }
}