class Program
{
static void Main(string[] args)
{
List<Book> books = new List<Book>
{
new Book
{
Name="C# in Depth",
Authors = new List<Author>
{
new Author
{
FirstName = "Jon", LastName="Skeet"
},
new Author
{
FirstName = "Jon", LastName="Skeet"
},
}
},
new Book
{
Name="LINQ in Action",
Authors = new List<Author>
{
new Author
{
FirstName = "Fabrice", LastName="Marguerie"
},
new Author
{
FirstName = "Steve", LastName="Eichert"
},
new Author
{
FirstName = "Jim", LastName="Wooley"
},
}
},
};
var temp = books.SelectMany(book => book.Authors).Distinct();
foreach (var author in temp)
{
Console.WriteLine(author.FirstName + " " + author.LastName);
}
Console.Read();
}
}
public class Book
{
public string Name { get; set; }
public List<Author> Authors { get; set; }
}
public class Author
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override bool Equals(object obj)
{
return true;
//if (obj.GetType() != typeof(Author)) return false;
//else return ((Author)obj).FirstName == this.FirstName && ((Author)obj).FirstName == this.LastName;
}
}
Điều này dựa trên một ví dụ trong "LINQ in Action". Liệt kê 4.16.Sự khác biệt không hoạt động với LINQ đối tượng
Điều này in Jon Skeet hai lần. Tại sao? Tôi thậm chí đã cố gắng ghi đè phương thức Equals trong lớp Author. Still Distinct dường như không hoạt động. Tôi đang thiếu gì?
Chỉnh sửa: Tôi cũng đã thêm == và! = Quá tải toán tử. Vẫn không giúp được gì.
public static bool operator ==(Author a, Author b)
{
return true;
}
public static bool operator !=(Author a, Author b)
{
return false;
}
IEquatable là tốt nhưng không đầy đủ; bạn nên * luôn luôn * thực hiện Object.Equals() và Object.GetHashCode() với nhau; IEquatable .Equals không ghi đè Object.Equals, do đó, điều này sẽ thất bại khi thực hiện so sánh không mạnh mẽ, thường xảy ra trong các khuôn khổ và luôn luôn trong các bộ sưu tập không chung chung. –
AndyM
Vì vậy, nó là tốt hơn để sử dụng ghi đè của biệt mà mất IEqualityComparer như Rex M đã gợi ý? Ý tôi là tôi nên làm gì nếu tôi không muốn rơi vào cái bẫy. –
Tanmoy
@Tanmoy nó phụ thuộc. Nếu bạn muốn Tác giả bình thường hành xử như một đối tượng bình thường (nghĩa là chỉ bình đẳng tham chiếu) nhưng kiểm tra các giá trị tên cho mục đích Phân biệt, hãy sử dụng IEqualityComparer. Nếu bạn luôn * muốn các đối tượng Tác giả được so sánh dựa trên các giá trị tên, thì hãy ghi đè GetHashCode và Equals hoặc thực hiện IEquatable. –