【问题标题】:Linq Join Two List , Group By Result And Select Distinct ValueLinq加入两个列表,按结果分组并选择不同的值
【发布时间】:2021-03-11 12:32:55
【问题描述】:

我计划加入 2 个列表,并按条码分组,并获得 reducePrice 和 ItemPrice 列的不同值。我应该如何在 Linq 中实现这一点? (我想要相交结果。我不想要来自 list2 的数据,例如 Barcode 003,004,005) 这是我尝试过的。

var sameJanWithDiffPriceList3 = (from item in list1                                                 
                                 join t in list2 on item.BarcodeNo equals t.BarcodeNo
                                 group item by item.BarcodeNo
                                 into grp
                                 select new
                                 {
                                     BarcodeNo = grp.Key,
                                     ReducedPrice = grp.Select(x => x.ReducedPrice).Distinct().Count(),
                                     ItemPrice = grp.Select(x => x.ItemPrice).Distinct().Count()
                                  }).ToList();

列表 1

Barcode reducedPrice ItemPrice
000 100 120
000 320 420
001 200 360
001 400 860
002 120 160
099 120 160

清单 2

Barcode reducedPrice ItemPrice ItemCode
000 100 120 00
001 200 360 01
002 120 160 02
003 120 160 02
004 120 160 02
005 120 160 02

我想要的结果

Barcode Count(DistinctReducedPrice) Count(DistinctItemPrice)
000 2 2
001 3 3
002 1 1
099 1 1

我得到的结果

Barcode Count(DistinctReducedPrice) Count(DistinctItemPrice)
000 2 2
001 2 2
002 1 1
099 1 1

【问题讨论】:

  • 你能告诉我们你已经尝试过什么吗?
  • @Arcord 我编辑了问题。请检查。谢谢。
  • 我不知道你尝试过的代码结果,但看起来你只需要使用Count 而不是ToList
  • @demo 我用我得到的结果编辑问题。请检查。谢谢。
  • 如果你想要交集,为什么结果有“099”,因为list2不包含它?另外,为什么“001”只有 3 个,因为它只有 2 个不同的值(200 和 400)?

标签: c# linq


【解决方案1】:

您可以使用以下查询

var sameJanWithDiffPriceList3 = (from item in list1
      join t in list2 on item.Barcode equals t.Barcode into joined
      from j in joined.DefaultIfEmpty()
      select new
      {
          Barcode = item.Barcode,
          reducedPrice = item.reducedPrice + "," + j.reducedPrice,
          ItemPrice = item.ItemPrice + "," + j.ItemPrice,
      }
      into grp
      group grp by new { grp.Barcode }
      into result
      select new
      {
         Barcode = result.Key,
         DistinctReducedPrice = string.Join(",", result.Select(a => a.reducedPrice).ToArray()).ToString().Replace(",0","").Split(',').Distinct().Count(),
         DistinctItemPrice = string.Join(",", result.Select(a => a.ItemPrice).ToArray()).ToString().Replace(",0", "").Split(',').Distinct().Count()
      }).ToList();

【讨论】:

  • 我认为您甚至不需要在这里加入。在他的情况下,工会就足够了。
  • 我没有测试联合,但我认为它会。这也是一种方法。
  • @meysamasadi 当来自 list1 的数据不包含来自 list2 的数据时,我得到 Nullreference 异常。我编辑了我的问题的某些部分。请你再帮忙。
  • 我用新数据测试了代码。工作正常。有什么问题?!
【解决方案2】:

这应该可以解决问题:

var list2 = new List<(string Barcode,int reducedPrice, int ItemPrice,string ItemCode)>{
    ("000",100,120,"00"),
    ("001",200,360,"01"),
    ("002",120,160,"02"),
    ("003",120,160,"02"),
    ("004",120,160,"02"),
    ("005",120,160,"02")
};

var list1 = new List<(string Barcode,int reducedPrice, int ItemPrice)>{
    ("000",100,120),
    ("000",320,420),
    ("001",200,360),
    ("001",400,860),
    ("002",120,160),
    ("099",120,160)
};


var result = list1.Select(x=>new {x.Barcode,x.reducedPrice,x.ItemPrice})
    .Concat(list2.Select(x=>new {x.Barcode,x.reducedPrice,x.ItemPrice}))
    .GroupBy(
        x=>x.Barcode,
        (k,v)=>new {
            Barcode=k,
            DistinctReducedPrice=v.Select(x=>x.reducedPrice).Distinct().Count(),
            DistinctItemPrice=v.Select(x=>x.ItemPrice).Distinct().Count()
        }
    )
    .ToList();

编辑:对于您的新需求(仅交集),您可以稍微修改上面的代码:

var commonKey = list1.Select(x=>x.Barcode).Intersect(list2.Select(x=>x.Barcode)).ToHashSet();

var result = list2.Where(x=>commonKey.Contains(x.Barcode)).Select(x=>new {x.Barcode,x.reducedPrice,x.ItemPrice})
    .Concat(list1.Where(x=>commonKey.Contains(x.Barcode)).Select(x=>new {x.Barcode,x.reducedPrice,x.ItemPrice}))
    .GroupBy(
        x=>x.Barcode,
        (k,v)=>new {
            Barcode=k,
            DistinctReducedPrice=v.Select(x=>x.reducedPrice).Distinct().Count(),
            DistinctItemPrice=v.Select(x=>x.ItemPrice).Distinct().Count()
        }
    )
    .ToList();

/*Result:
Barcode DistinctReducedPrice DistinctItemPrice
000     2                    2 
001     2                    2 
002     1                    1 
*/

这仍然没有解释,如果你想要交集,为什么结果有“099”,因为list2不包含它。另外,为什么“001”只有 2 个不同的值(200 和 400;360 和 860),你为什么期望 3 和 3?

【讨论】:

  • 先生。谢谢你。我编辑了这个问题。我不想要相交的结果。不是联合结果。如果列表 1 中不包含这些数据,我不想要列表 2 中的数据。请您再试一次。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2021-03-31
  • 2013-01-26
相关资源
最近更新 更多