0

我有一个发票行对象列表。

我想显示唯一发票列表,以便稍后我可以显示所选不同发票的发票行。

    List<Invoice> returnInvoices = (List<Invoice>)Session["Invoices"];
    var uniqueInvoices = from i in returnInvoices
                           select new
                           {
                               i.InvoiceNo,
                               i.InvoiceDate,
                               i.OrderNo,
                               i.CustomerPO,
                           };
    GridView3.DataSource = uniqueInvoices;
    GridView3.DataBind();

如何返回独特的结果InvoiceNo?我真的很难理解这个:(

4

2 回答 2

4

真的,您不应该担心从会话变量中获取不同的发票 - 您应该首先担心为什么会有重复的发票。您在什么时候将发票添加到会话变量而不检查是否已经存在?

也就是说,您可以为每个 ID 选择一张发票,如下所示:

var nonUniqueInvoices = from i in returnInvoices
                       select new
                       {
                           i.InvoiceNo,
                           i.InvoiceDate,
                           i.OrderNo,
                           i.CustomerPO,
                       }; // as before
var uniqueInvoices = nonUniqueInvoices
    .GroupBy(i => i.InvoiceNo)
    .Select(g => g.First());
GridView3.Datasource = uniqueInvoices; // as before

这将只选择它在列表中找到的每个 ID 的第一张发票;这可能不是最新的副本。


如果您需要 ID,而不是每个 ID 的一项,则可以使用

var uniqueInvoiceIDs = returnInvoices.Select(i => i.InvoiceNo).Distinct();

这应该更有效率。

于 2012-12-17T16:33:13.010 回答
0

建立一个自定义EqualityComparer<Invoice>for Enumerable.Distinct

public class InvoiceComparer : IEqualityComparer<Invoice>
{
    public bool Equals(Invoice x, Invoice y)
    {
        if (x == null || y == null) return false;
        return x.InvoiceNo == y.InvoiceNo;
    }

    public int GetHashCode(Invoice obj)
    {
        if (obj == null) return int.MinValue;

        return obj.InvoiceNo.GetHashCode();
    }
}

然后您可以使用Distinct自定义比较器获得结果:

List<Invoice> invoices = (List<Invoice>)Session["Invoices"];
IEnumerable<Invoice> uniqueInvoices = invoices.Distinct(new InvoiceComparer());
于 2012-12-17T16:45:16.133 回答