如何从对象列表中删除重复?

时间:2014-02-12 05:58:24

标签: c#

我有一个清单:

public class myObject(){
  public string Id {get;set}
  public string Name {get;set}
}

var list = new List<MyObject>();

现在我要删除列表中的所有重复项:

var dupsId=
    from p in list
    group p by p.Id into g
    where g.Count() > 1
    select g.Key;

var dups= new List<MyObject>();
    foreach (var id in dupsId)
    {
      foreach (var listItem in list.FindAll(p => p.Id== id))
      {
         dups.Add(listItem);
      } 
    }
 dups.ForEach(p=>list.Remove(p));

它真的删除所有重复但我想要保存一个。例如:

 list{
   {1,aaaa}
   {2,bbbb}
   {1,aaaa}
   {3,cccc}   
   {1,aaaa}
   {2,bbbb}             
 }

我想得到:

 list{
   {1,aaaa}
   {2,bbbb}
   {3,cccc}              
 }

我如何修改我的代码呢?

3 个答案:

答案 0 :(得分:3)

根据您的评论,您只想按ID进行比较,查看MoreLINQ并使用DistinctBy运算符并按ID选择不同的对象。这就像下面的

var distinct = items.DistinctBy( i => i.Id );

答案 1 :(得分:2)

您可以按Id对列表进行分组,然后从每个组中选择第一个元素

var distinctList = list.GroupBy(x => x.Id).Select(y => y.First());

答案 2 :(得分:1)

创建相等比较器:

public sealed class myObjectEqualityComparer : IEqualityComparer<myObject>
{
    public bool Equals(myObject x, myObject y)
    {
        // null checking here

        return x.Id == y.Id;
    }

    public int GetHashCode(myObject obj)
    {
        return obj.Id.GetHashCode();
    }
}

并在Distinct方法中使用它:

        var uniqueItems = list
            .Distinct(new myObjectEqualityComparer());