繁体   English   中英

区分对象列表的列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM