gpt4 book ai didi

c# - 使用 Linq 合并两个列表并获取总数

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:49 25 4
gpt4 key购买 nike

我有来自两个不同仓库的以下两个列表。

var list1 = new List<Tshirt> {
new Tshirt(){ Color = "blue", size="M", qty=3 },
new Tshirt(){ Color = "red", size="M", qty=2 },
new Tshirt(){ Color = "green", size="M", qty=3 },
new Tshirt(){ Color = "blue", size="M", qty=3 },
}

var list2 = new List<Tshirt> {
new Tshirt(){ Color = "blue", size="M", qty=5 },
new Tshirt(){ Color = "red", size="M", qty=7 },
}

使用 LINQ,如何得到这样的组合列表。

var list3 = new List<Tshirt> {
new Tshirt(){ Color = "blue", size="M", qty=11 },
new Tshirt(){ Color = "red", size="M", qty=9 },
new Tshirt(){ Color = "green", size="M", qty=3 }
}

最佳答案

(我最初错误地回答了这个问题,请参阅下面的第二个标题(“将所有不同的 Tshirt 实例组合在一起”)作为我最初的、无关的答案)

合并所有 Tshirt 实例并求和它们的数量:

我看到您正在使用 color + size 的元组唯一标识一种类型的 T 恤,这意味着如果我们将所有 Tshirt实例在一起( Concat ),然后按 color + size 对它们进行分组, 然后 Sum qty值,然后返回新的 Tshirt新列表中的实例。

List<Tshirt> aggregatedShirts = uniqueShirts = Enumerable
.Empty<Tshirt>()
.Concat( list1 )
.Concat( list2 )
.GroupBy( shirt => new { shirt.Color, shirt.size } )
.Select( grp => new Tshirt()
{
Color = grp.Key.Color,
size = grp.Key.size,
qty = grp.Sum( shirt => shirt.qty )
} )
.ToList();

合并所有不同的Tshirt一起实例

假设class Tshirt工具 IEquatable<Tshirt>然后使用 Concat( ... ).Distinct().ToList() :

我会这样做,其他人可能不喜欢使用 Empty :

List<Tshirt> uniqueShirts = Enumerable
.Empty<Tshirt>()
.Concat( list1 )
.Concat( list2 )
.Distinct()
.ToList();

如果Tshirt不执行 IEquatable那么你可以使用 Distinct 的重载接受 IEqualityComparer<TSource> :

class TshirtComparer : IEqualityComparer<Tshirt>
{
public static TshirtComparer Instance { get; } = new TshirtComparer();

public Boolean Equals(Tshirt x, Tshirt y)
{
if( ( x == null ) != ( y == null ) ) return false;
if( x == null ) return true;

return x.Color == y.Color && x.size == y.size && x.qty == y.qty;
}

public Int32 GetHashCode(Tshirt value)
{
if( value == null ) return 0;
// See https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode
Int32 hash = 17;
hash = hash * 23 + value.Color?.GetHashCode() ?? 0;
hash = hash * 23 + value.size?.GetHashCode() ?? 0;
hash = hash * 23 + value.qty;
return hash;
}
}

用法:

List<Tshirt> uniqueShirts = Enumerable
.Empty<Tshirt>()
.Concat( list1 )
.Concat( list2 )
.Distinct( TshirtComparer.Instance )
.ToList();

然后得到总数量:

Int32 totalQuantity = uniqueShirts.Sum( shirt => shirt.qty );

关于c# - 使用 Linq 合并两个列表并获取总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com