linq 查找列表C#中相同值的不同值

1tu0hz3e  于 2023-03-05  发布在  C#
关注(0)|答案(3)|浏览(205)

我有一个包含ordernumberinvoiceNumberitemnumber字段的列表。

List<OrderDetail> lst=new List<OrderDetail>()
{
    new OrderDetail{
        ordernumber="O123",
        invoiceNumber="Inv123",
        itemnumber="I123"}
}

lst.Add(new OrderDetail(){
ordernumber="O123",
invoiceNumber="Inv124",
itemnumber="I145"
});

lst.Add(new OrderDetail(){
ordernumber="O456",
invoiceNumber="Inv125",
itemnumber="I145"
});

lst.Add(new OrderDetail(){
ordernumber="O456",
invoiceNumber="Inv125",
itemnumber="I145"
});

我想找到所有ordernumber相同但invoiceNumbers不同的订单,然后抛出一个错误,我们如何识别这样的记录?
我使用了以下代码:

List<string> lstOrders=lst.select(x=>x.ordernumber).Distinct().ToList();
foreach(var order in lstOrders)
{
  List<string>lstInvoice = lst.where(x=>x.ordernumber==order).select(x=>invoiceNumber).Distinct().ToList();
   if(lstInvoice.Count >1)
   {
     throw;
   }
}

有没有其他有效的方法?

4ioopgfo

4ioopgfo1#

如果要查找具有多张发票的所有订单,可以使用以下命令:

var duplicateOrdersWithDifferentInvoiceNumbers = lst
    .GroupBy(o => o.ordernumber)
    .Where(g => g.Select(o => o.invoiceNumber).Distinct().Count() > 1);
nukf8bse

nukf8bse2#

您可以使用LINQ GroupBy按订单号对订单进行分组,然后筛选具有多个不同发票号的组。

var groups = lst.GroupBy(o => o.ordernumber);

foreach (var orderGroup in groups)
{
    var invoices = orderGroup.Select(o => o.invoiceNumber).Distinct();
    
    if (invoices.Count() > 1)
    {
       //do something else here
    }
}
ncecgwcz

ncecgwcz3#

核心部分与Tim的答案相同,不过我添加了可以为具有不同发票的每个订单抛出异常的部分。

var duplicates = lst.GroupBy(a => a.ordernumber)
    .Where(b => b.Select(c => c.invoiceNumber).Distinct().Count() > 1).ToArray();

for (int i = 0; i < duplicates.Length; i++)
{
    var invoices = duplicates[i].Select(d => d.invoiceNumber);
    string report = $"Order numbered {duplicates[i].First().ordernumber} have different invoice numbers: {string.Join(", ", invoices)}.";
    Console.WriteLine(report);
}

对于您的示例,它将输出:
订单编号O123具有不同的发票编号:入侵123入侵124。

相关问题