gpt4 book ai didi

c# - 有没有更好的方法来做到这一点,也许用 LINQ ish 替换 for/foreach 循环?

转载 作者:行者123 更新时间:2023-11-30 18:00:11 26 4
gpt4 key购买 nike

我有一个现有馆藏列表,我想合并到另一个馆藏列表中。我知道使用 foreach 和 for 循环是一种糟糕的方式,但我想不出使用 LINQ 来减少这种情况的好方法。

private void CombineHoldings(List<Holding> holdingsToAdd, ref List<Holding> existingHoldings)
{
foreach (Holding holdingToAdd in holdingsToAdd)
{
Boolean found = false;
for (int i = 0; i < existingHoldings.Count; i++)
{
if (existingHoldings[i].Sector == holdingToAdd.Sector)
{
found = true;
existingHoldings[i].Percentage += holdingToAdd.Percentage;
}
}
if (!found)
existingHoldings.Add(holdingToAdd);
}
foreach (Holding holding in existingHoldings)
holding.Fund = "Combined Funds";
}

最佳答案

让函数改变原始列表使其非常非 Linq,因此这是一个将两个列表视为不可变的版本:

private List<Holding> CombineHoldings(
List<Holding> holdingsToAdd,
List<Holding> existingHoldings)
{
var holdings = existingHoldings.Concat(holdingsToAdd)
.GroupBy(h => h.Sector)
.Select(g =>
{
var result = g.First();
result.Percentage = g.Select(h => h.Percentage).Sum();
return result;
});
return holdings.ToList();
}

肯定不会赢得性能竞赛,但我喜欢它的简单性。以下可能会更快,但更复杂,并且需要您覆盖 Holdings 上的相等性以比较部门或创建 IEqualityComparer<Holding> :

private List<Holding> CombineHoldings(
List<Holding> holdingsToAdd,
List<Holding> existingHoldings)
{
var holdings = existingHoldings.GroupJoin(holdingsToAdd, h => h, h => h,
(h, toAdd) =>
new Holding(
h.Sector,
/*Other parameters to clone*/,
h.Percentage + toAdd.Select(i => i.Percentage).Sum())
).ToList();
holdings.AddRange(holdingsToAdd.Except(holdings));
return holdings;
};

关于c# - 有没有更好的方法来做到这一点,也许用 LINQ ish 替换 for/foreach 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10359231/

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