如何让Distinct()与一组自定义对象一起使用

swo*_*978 2 .net c# linq iequatable

我已经按照这篇文章中的建议尝试让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>{ }
Run Code Online (Sandbox Code Playgroud)

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

InvoiceItems distinctItems = aBunchOfInvoiceItems.Distinct();  
Run Code Online (Sandbox Code Playgroud)

当我设置此代码并运行它时,我收到一个错误

无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'InvoiceReader.Form1.InvoiceItems'.存在显式转换(您是否错过了演员?)

我不明白如何解决这个问题.我应该采取不同的方法吗?任何建议都非常感谢.

Kon*_*lph 5

Distinct返回一个通用的IEnumerable<T>.它并没有返回一个InvoiceItems实例.实际上,在窗帘后面它返回一个代理对象,该对象实现一个迭代器,只能按需访问(即迭代它时).

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

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

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

// …

InvoiceItems distinctItems = new InvoiceItems(aBunchOfInvoiceItems.Distinct());
Run Code Online (Sandbox Code Playgroud)