我有发票行对象列表。
我想显示一份独特的发票清单,以便稍后我可以显示所选不同发票的发票行。
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
上返回唯一结果?我真的很想弄清楚这个:(
答案 0 :(得分: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();
应该更有效率。
答案 1 :(得分:0)
为Enumerable.Distinct
构建EqualityComparer<Invoice>
的自定义:
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());