2016-01-27 52 views
-2

我用下面的代码尝试检查如果列表包含重复的数据不起作用:C#的LINQ独特的名单

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var list = new List<Obj>() { new Obj() { id = "1", name = "1" }, new Obj() { id = "1", name = "1" } }; 
     Console.WriteLine(AllItemsAreUnique(list)); 
    } 

    public static bool AllItemsAreUnique<T>(IEnumerable<T> items) 
    { 
     return items.Distinct().Count() == items.Count(); 
    } 
} 

internal class Obj 
{ 
    public string id; 
    public string name; 
} 

,结果是真的!为什么?

+4

因为“具有相同属性的两个对象”并不意味着“两个相等的对象”,请参见重复。 – CodeCaster

回答

2

为什么?

默认情况下,比较将使用引用,在这种情况下,两个对象引用不相同。

您需要实施IEquatable<T>才能为Distinct()提供特定类型的Equals()方法。

+0

嗯...有没有easiersolution?谢谢。 –

+0

相当容易: 内部类Obj:IEquitable { public string id; 公共字符串名称; public bool Equals(Obj other) { reutrn id == other.id && name == other.name; } } 我省略了一些必要的代码:覆盖Equals(object)和GetHashCode()。但是,即使您不覆盖它们也不会有什么大问题。 –