为了账号安全,请及时绑定邮箱和手机立即绑定

不使用LINQto对象的区别

不使用LINQto对象的区别

郎朗坤 2019-07-13 10:23:12
不使用LINQto对象的区别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;     }}这是基于“LINQ in Action”中的一个例子。清单4.16。这印了乔恩·斯基特两次。为什么?我甚至在Author类中尝试过重写等于方法。仍然不同似乎不起作用。我遗漏了什么?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

这个Distinct()方法检查引用类型的引用相等性。这意味着它在寻找相同的复制对象,而不是包含相同值的不同对象。

有一个过载这需要一个质量检验员,因此您可以指定不同的逻辑来确定给定对象是否等于另一个对象。

如果希望Author的行为通常类似于普通对象(即仅引用相等),但为了根据名称值进行不同的检查相等,请使用质量检验员..如果您总是希望根据名称值对Author对象进行比较,那么重写GetHashCode并等于,或实施I赤道.

.上的两个成员IEqualityComparer接口EqualsGetHashCode..你的逻辑决定两个Author如果名字字符串和姓字符串相同,则对象看起来是相等的。

public class AuthorEquals : IEqualityComparer<Author>{
    public bool Equals(Author left, Author right)
    {
        if((object)left == null && (object)right == null)
        {
            return true;
        }
        if((object)left == null || (object)right == null)
        {
            return false;
        }
        return left.FirstName == right.FirstName && left.LastName == right.LastName;
    }

    public int GetHashCode(Author author)
    {
        return (author.FirstName + author.LastName).GetHashCode();
    }}


查看完整回答
反对 回复 2019-07-13
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

另一个没有实现的解决方案IEquatableEqualsGetHashCode是使用LINQGroupBy方法,并从IGrouping中选择第一个项。

var temp = books.SelectMany(book => book.Authors)
                .GroupBy (y => y.FirstName + y.LastName )
                .Select (y => y.First ());foreach (var author in temp){
  Console.WriteLine(author.FirstName + " " + author.LastName);}


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信