当你说:
{APL10, APL20, APL50} => {APLE80}
or
{APL10, APL20, ORG50} => {APL30, ORG50}
如果你的意思是
我有这个:{new Fruit("APL",10), new Fruit("APL", 20), new Fruit("ORG",50)},我想生成一个类似{new Fruit("APL",30), new Fruit("ORG",50)}的列表
我会说:
您需要有一些容器来容纳所有不同的代码并将它们映射到 Amounts 的总和。为此,我们经常使用字典:
var d = new Dictionary<string,decimal>();
foreach(var f in fruit){
if(!d.ContainsKey(f.Code))
d[f.Code] = f.Amount;
else
d[f.Code] += f.Amount;
}
在此操作结束时,您的字典将包含一组唯一的水果代码和所有数量的总和。您可以通过枚举字典并以与最初创建列表类似的方式创建列表来将其重新转换为水果列表
一旦你明白了这一点,你就可以看看如何使用 LINQ,然后执行以下操作:
var summedFruits = fruits
.GroupBy(f => f.Code)
.Select(g => new Fruit(g.Key, g.Sum(f => f.Amount)));
(这假设你的 Fruit 有一个构造函数,它接受一个代码和一个数量)。当您在 LINQ 中进行 GroupBy 时,您会得到一个类似于列表列表的输出。原始输入列表被分解成一些列表;每个列表中的所有内容都具有与您声明的键相同的值(我说按代码分组)
所以你的原始表示:
{APL10, APL20, ORG50}
最终看起来像:
Key = APL, List = {APL10, APL20}
Key = ORG, List = {ORG50}
你的“一个三样东西的列表”已经变成了“一个(两个 APL 的列表)和(一个 ORG 的列表)的列表”
如果您随后在它们上运行选择,您可以创建一个新 Fruit,它使用 Key 作为代码并总结每个列表中的数量
Key = APL, List = {APL10, APL20}, Sum = 30
Key = ORG, List = {ORG50}, Sum = 50
在这段代码中:
var summedFruits = fruits
.GroupBy(f => f.Code)
.Select(g => new Fruit(g.Key, g.Sum(f2=> f2.Amount)));
f 是一个水果,是原始列表中的 3 个水果之一。我们按水果的代码分组。 g是分组操作的结果,是一个“有共同代码的水果列表”,Key是代码(apl或org)。 g 是一个列表,所以你可以调用 sum 。 g 列表中的每个项目都是一个水果,这就是为什么我切换回f(当我说 f2 时),以帮助记住它是一个单独的水果——我们正在对数量求和。对于 APL 的第一个列表,总和为 30。在操作结束时,会产生一个新列表;一个有两个元素 - APL 和 ORG,但数量是所有元素的总和