c#迭代列表以合并具有相同字段的项目

faf*_*ase 1 c# linq algorithm

所以我会有一个带有匹配字段的数据列表:

class Data
{
   public string type;
   public int amount;
   public Data(string type, int amount)
   {
       this.type = type;
       this.amount = amount;
   }
}


List<Data> list = new List<Data>()
        {
            new Data("A", 20),
            new Data("A", 10),
            new Data("B", 20),
            new Data("B", 20),
            new Data("C", 20)
        };
Run Code Online (Sandbox Code Playgroud)

我希望这些项目合并为一个,如果它们的类型相同,则添加该值。所以我会有“A”=> 30,“B”=> 40 和“C”=> 20。

我可以解决这个问题:

    private IEnumerable<Data> MergeDuplicates(IEnumerable<Data> list)
    {
        Dictionary<string, long> dict = new Dictionary<string, long>();
        foreach(Data data in list) 
        {
            if (dict.ContainsKey(data.type)) 
            {
                dict[data.type] += data.amount;
                continue;
            }
            dict.Add(data.type, data.amount);
        }
        List<Data> newList = new List<Data>();
        foreach(KeyValuePair<string, long> kvp in dict) 
        {
            newList.Add(new Data(kvp.Key, kvp.Value));
        }
        return newList;
    }
Run Code Online (Sandbox Code Playgroud)

它可以工作,但感觉应该更长,更复杂。特别是当没有重复时,它仍然来回运行列表。

我试图研究 Linq,但不确定要搜索什么。它也不是很灵活,因为它只支持数据类型并且谓词在方法中被硬编码。

Chr*_*tos 6

你可以像这样尝试使用GroupBy

List<Data> list = new List<Data>()
{
    new Data("A", 20),
    new Data("A", 10),
    new Data("B", 20),
    new Data("B", 20),
    new Data("C", 20)
};

var result = list.GroupBy(item => item.type)
                 .Select(gr => new Data(gr.Key, gr.Sum(x=>x.amount)))
                 .ToList();
Run Code Online (Sandbox Code Playgroud)


zai*_*man 5

所以最好用Linq.

添加 using System.Linq;

进而:

var result = list
            .GroupBy(x => x.type)
            .Select(x => new Data(x.Key, x.Sum(z => z.amount)))
            .ToList();
Run Code Online (Sandbox Code Playgroud)

result将包含列表Data与你在之后的值