c# - 从 List<> 中删除重复的项目并记录重复的数量

标签 c# algorithm

我有一个 List<Item> . Item具有属性 Id , NameAmount .此列表中有重复项。我需要一个新的 List<Item>其中仅包含非重复的 Item s 和 ItemAmount应该是第一个复制了多少次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/

相关文章:

algorithm - 如何使用到达时间调度 FCFS 算法中的进程?

c# - 远程服务器返回错误 : (550) on upload file to FTP using FtpWebRequest

c# - Visual Studio 自定义控件 dll 访问被拒绝错误

c# - Postal 中的 @Html.Raw 相当于什么?

c# - MongoDB C# 驱动程序创建索引

c# - XmlSerializer 和可为空的属性

algorithm - 从体素列表创建邻域图比 O(n^2) 更快?

algorithm - 如何识别什么是尾递归,什么不是尾递归?

algorithm - 在 Weka 中堆叠

c# - 区分大型数据列表的最佳方式、算法和方法是什么?