所以我会有一个带有匹配字段的数据列表:
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,但不确定要搜索什么。它也不是很灵活,因为它只支持数据类型并且谓词在方法中被硬编码。
你可以像这样尝试使用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)
所以最好用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与你在之后的值
| 归档时间: |
|
| 查看次数: |
34 次 |
| 最近记录: |