Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq删除列表中的重复项_C#_Linq - Fatal编程技术网

C# 使用linq删除列表中的重复项

C# 使用linq删除列表中的重复项,c#,linq,C#,Linq,假设您有一个MyObject列表,如下所示: public class MyObject { public int ObjectID {get;set;} public string Prop1 {get;set;} } public class MyObject : IEquatable<MyObject> { public int ObjectID {get;set;} public string Prop1 {get;set;} public

假设您有一个MyObject列表,如下所示:

public class MyObject
{
  public int ObjectID {get;set;}
  public string Prop1 {get;set;}
}
public class MyObject : IEquatable<MyObject>
{
    public int ObjectID {get;set;}
    public string Prop1 {get;set;}

    public bool Equals(MyObject other)
    {
        if (other == null) return false;
        else return this.ObjectID.Equals(other.ObjectID); 
    }

    public override int GetHashCode()
    {
        return this.ObjectID.GetHashCode();
    }
}
如果列表中可能有多个具有相同ObjectID的对象实例,如何从列表中删除重复项

谢谢。

您可以使用
GroupBy()
并选择每个组的第一项来实现您想要的-假设您想为每个不同的
ObjectId
属性选择一项:

var distinctList = myList.GroupBy(x => x.ObjectID)
                         .Select(g => g.First())
                         .ToList();
或者,中还有
DistinctBy()
,允许使用更简洁的语法(但会向项目添加依赖项):


可以使用
Distinct()
方法执行此操作。但是由于该方法使用默认的相等比较器,您的类需要实现
IEquatable
,如下所示:

public class MyObject
{
  public int ObjectID {get;set;}
  public string Prop1 {get;set;}
}
public class MyObject : IEquatable<MyObject>
{
    public int ObjectID {get;set;}
    public string Prop1 {get;set;}

    public bool Equals(MyObject other)
    {
        if (other == null) return false;
        else return this.ObjectID.Equals(other.ObjectID); 
    }

    public override int GetHashCode()
    {
        return this.ObjectID.GetHashCode();
    }
}

您可以通过实现IEqualityComparer接口来创建自定义对象比较器:

public class MyObject
{
    public int Number { get; set; }
}

public class MyObjectComparer : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        return x.Id == y.Id;
    }

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

为什么会有具有相同ID的对象(通常正是因为这个原因而保持不同的ID…)?我想您可以创建一个ID和Sting的列表(作为一个复合字符串),然后执行一个.Distinct()但我认为如果ID是非唯一的,则会有更根本的错误。@soandos:他可能有办法在意外情况下两次获取列表中的同一对象。@notfed:这仍然表明出现了问题。但如果外部源中出现了问题,则必须删除重复项。好的,很酷,就是这样。myList=myList。。。。还工作吗?只是想避免创建一个新列表。@frenchie:当然可以,您可以重新分配给同一个列表变量。使用linq时,您无法避免创建一个新列表。如果您想使用相同的列表,您必须使用
list.Remove(item)
list.RemoveAt(index)
自己修改它。我尝试了这个方法,但它不适用于我的对象列表。我仍然收到了复制件。请看我的问题:使用MoreLinq之类的东西有什么缺点吗?这会使代码看起来非常优雅!而且易于阅读。:-)为什么这比上面提供的三行答案更好?它还能做什么呢?它可以比较你的对象。其他一些列表功能也需要这样做,具有ID的对象(实体)应该可以通过其ID进行比较。@frenchie:我认为它比
GroupBy
解决方案更优雅、更可读,并且与
DistinctBy
解决方案不同,当我使用这个方法并使用foreach循环调试列表时,我仍然会得到重复的库。请查看我的问题:尝试了这个,但我仍然返回了重复的列表。
myList.Distinct(new MyObjectComparer())