Linq连接两个列表,按结果分组并选择不同的值



我计划加入2个列表,并按条形码分组,获得reducedPrice和ItemPrice列的不同值。我应该如何在林克做到这一点?(我想要交集结果。我不想要来自列表2的数据,如条形码003004005(这就是我尝试过的。

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

项目价格
条形码reducedPrice
000100120
000320420
001200360
001400860
002120160
099120160

您可以使用以下查询

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();

这应该可以做到:

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不包含它。还有,为什么你期望3和3代表";001〃;因为它只有两个不同的值(200和400;360和860(?

最新更新