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"中的一个例子. list 4.16.

这张照片印了乔恩·斯基特两次.为什么?我甚至在Author类中try 重写Equals方法.仍然清晰似乎不起作用.我错过了什么?

编辑:

 public static bool operator ==(Author a, Author b)
    {
        return true;
    }
    public static bool operator !=(Author a, Author b)
    {
        return false;
    }

推荐答案

LINQ Distinct在定制对象方面并不是那么聪明.

它所做的只是查看列表,看看它有两个不同的对象(不在乎它们的成员字段值是否相同).

一种解决方法是实现IEquatable接口,如图here所示.

如果像这样修改Author类,它应该可以工作.

public class Author : IEquatable<Author>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public bool Equals(Author other)
    {
        if (FirstName == other.FirstName && LastName == other.LastName)
            return true;

        return false;
    }

    public override int GetHashCode()
    {
        int hashFirstName = FirstName == null ? 0 : FirstName.GetHashCode();
        int hashLastName = LastName == null ? 0 : LastName.GetHashCode();

        return hashFirstName ^ hashLastName;
    }
}

100

.net相关问答推荐

使用CLR将数据从Excel导入SQL Server时出错

EFCore.DbSet.Update 方法添加新行而不是更新它

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

cmd 冻结中的 dotnet 命令.怎么了?

部署时如何控制红隼端口?

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

在 C# 中输入按键

如何判断一个类型是否是简单类型?即持有一个单一的价值

如何从 .net 中的数组类型获取数组项类型

带有输入字段的消息框

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

寻找 .NET 的命令行参数解析器

如何制作通用类型转换函数

如何正确和完全关闭/重置 TcpClient 连接?

在 .NET 中获取默认打印机的最佳方法是什么

获取系统中已安装的应用程序

如何比较泛型类型的值?

MVC4 HTTP 错误 403.14 - 禁止

在 .NET 中乘以时间跨度

连接字符串而不是使用一堆 TextBlocks