![](/img/trans.png)
[英]C# - Getting flat many-to-many List of Objects into List of distinct combinations of two Lists of objects
[英]Distinct over a list of lists of objects
考虑同一实体的对象列表列表
List<List<Car>> = {{ new Car("Opel"), new Car("VW") },
{ new Car("Opel"), new Car("Fiat"), new Car("Ford")}}
我希望所有列表中的所有对象都只有不同的汽车模型,但我想将列表保留在它们所在的位置。(不要将所有内容合并到一个列表中)
结果:
List<List<Car>> = {{ new Car("Opel"), new Car("VW") },
{ new Car("Fiat"), new Car("Ford")}}
到目前为止,我创建了一个自定义相等比较器,并使用 Linq 中的 distinct()。
无论如何,实现这一目标的最快方法是什么?
“最快”的方式? 为了谁? 找到它的代码还是开发人员编写它? :)
修改维护这些列表的任何逻辑,以首先将汽车放入 HashSet 中。 如果 Add 为哈希集返回 false,则该汽车是已知的; 不要将其添加到任何列表中
void Add(Car x){
if(_carsHashSet.Add(x))
return;
//rest of your logic here to add car to some list
}
在返回 name.GetHashCode 和other.Equals(name)
的 Car 上提供 GetHashCode 和 Equals 的覆盖,以便 hashset 可以在汽车名称上正确工作
class Car{
public string Name { get; set; }
override GetHashCode(){
return Name.GetHashCode();
}
override Equals(object other){
return other is Car c && c.Name != null && c.Name.Equals(Name);
}
}
如果您的问题不是关于添加到列表的过程,而是您尝试对列表进行重复数据删除,请在遍历列表列表中的所有汽车时采用使用哈希集的相同方法; 将您看到的每辆车都添加到哈希集中。 如果添加操作返回 false,则该车是已知的,将其从列表中删除
您可以使用 foreach 向前迭代外部列表,但我建议使用for
向后迭代内部列表,因为它使代码更简单,而不必担心删除后后续项目的索引会改变
foreach(var ls in cars)
for(int x = ls.Count-1; x>=0; x--)
if(hashSet.Add(ls[x]))
ls.RemoveAt(x);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.