我有一个 List<Item>
. Item
具有属性 Id
, Name
和 Amount
.此列表中有重复项。我需要一个新的 List<Item>
其中仅包含非重复的 Item
s 和 Item
的 Amount
应该是第一个复制了多少次List<Item>
.我试过类似的东西
for (int i = 0; i < list.Count; i++)
{
for (int j = 0; j < list.Count; j++)
{
if (list[i].Name == list[j].Name)
{
list.Remove(prod.Components[j]);
list[i].Amount++;
}
}
}
但是这个循环有一些问题。我的大脑过热了。请帮忙。
最佳答案
一个简单的 LINQ 查询可以获得唯一项及其出现次数:
var distinct = list.GroupBy(o => o.Name)
.Select(g => new { Count = g.Count(), Item = g.First() })
.ToList();
然后你可以修改每个项目的Amount
重复计数:
foreach (var row in distinct)
{
row.Item.Amount = row.Count;
}
最后得到一个List<Item>
不包含重复项且数量正确:
var uniqueItems = distinct.Select(r => r.Item).ToList();
重要提示:上面的代码假设“重复”项目彼此无法区分,但没有别的(例如,它不需要 Item
来拥有默认构造函数)。根据具体情况,可以将其写成更短的形式。
另外,Amount
这里的属性(property)看起来很奇怪。由于重复不保证其金额的总和,Item.Amount
的目的是什么? ?我假设数量为 2 的重复项目应该导致一个项目的数量为 4,但您的代码不会这样做(而我的代码遵循该引导)。
关于c# - 从 List<> 中删除重复的项目并记录重复的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14977794/