c# - 如何让 Distinct() 处理自定义对象的集合

标签 c# .net linq iequatable

我已经听从了this post的建议尝试让 Distinct() 在我的代码中工作,但我仍然遇到问题。这是我正在使用的两个对象:

    public class InvoiceItem : IEqualityComparer<InvoiceItem>
    {
        public InvoiceItem(string userName, string invoiceNumber, string invoiceAmount)
        {
            this.UserName = userName;
            this.InvoiceNumber= invoiceNumber;
            this.InvoiceAmount= invoiceAmount;
        }
        public string UserName { get; set; }
        public string InvoiceNumber { get; set; }
        public double InvoiceAmount { get; set; }

        public bool Equals(InvoiceItem left, InvoiceItem right)
        {
            if ((object)left.InvoiceNumber == null && (object)right.InvoiceNumber == null) { return true; }
            if ((object)left.InvoiceNumber == null || (object)right.InvoiceNumber == null) { return false; }
            return left.InvoiceNumber == right.InvoiceNumber;
        }


        public int GetHashCode(InvoiceItem item)
        {
            return item.InvoiceNumber == null ? 0 : item.InvoiceNumber.GetHashCode();
        }
    }


    public class InvoiceItems : List<InvoiceItem>{ }

我的目标是用几千个 InvoiceItem 对象填充一个 InvoiceItems 对象(我们称它为 aBunchOfInvoiceItems)然后执行:

InvoiceItems distinctItems = aBunchOfInvoiceItems.Distinct();  

当我设置并运行这段代码时,我收到一条错误消息

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'InvoiceReader.Form1.InvoiceItems'. An explicit conversion exists (are you missing a cast?)

我不知道如何解决这个问题。我应该采取不同的方法吗?非常感谢任何建议。

最佳答案

Distinct返回一个通用的 IEnumerable<T> .它返回InvoiceItems实例。事实上,在幕后,它返回一个代理对象,该对象实现了一个仅按需访问的迭代器(即,当您对其进行迭代时)。

您可以明确地将其强制转换为 List<>调用.ToList() .不过,您仍然需要将其转换为您的自定义列表类型。最简单的方法可能是拥有一个合适的构造函数,然后调用它:

public class InvoiceItems : List<InvoiceItem> {
    public InvoiceItems() { }

    // Copy constructor
    public InvoiceItems(IEnumerable<InvoiceItems> other) : base(other) { }
}

// …

InvoiceItems distinctItems = new InvoiceItems(aBunchOfInvoiceItems.Distinct());

关于c# - 如何让 Distinct() 处理自定义对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226530/

相关文章:

c# - 具有相同名称的多个 SqlCommand 参数

c# - 使用 C# 将 Outlook 电子邮件自动保存到文件夹

c# - WCF 与服务总线

c# - 为我的 C# .NET Winform 应用程序创建单个连接文件

c# - 从 Func 返回 Func

c# - 请求被中止 : The request was canceled. 没有解决方案

c# - 什么是扩展类?

c# - 从 BitmapImage 获取支持的图像格式

c# - 在 C# 中的给定变量之间的表中查找最小值和最大值

LINQ 查询检查是否为空