2016-01-27 2 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>, чтобы предоставить метод Equals() для использования по типу Distinct().

+0

Ммм ... нет easiersolution? Благодарю. –

+0

Довольно легко: внутренний класс Obj: IEquitable { { 0 публичный идентификатор строки; имя публичной строки; public bool Equals (Obj other) { reutrn id == other.id && name == other.name; } } Я пропустил некоторый код, который необходим: переопределение Equals (object) и GetHashCode(). Однако это не будет большим вопросом, даже если вы не переопределите их. –

Смежные вопросы