在字典中合并键和值 - LINQ



>我有如下定义的类:

public class CoinRepository 
    {
        private Dictionary<Coin, int> repository;
        public CoinRepository()
        {
            repository = new Dictionary<Coin, int>();
        }
        public void Add(List<Coin> coins)
        {
            foreach (var coin in coins)
            {
                repository[coin] = repository.ContainsKey(coin) ? repository[coin] + 1 : 1;               
            }
        }      
    }       
   public class Coin
   {
     public int CoinValue { get; set; }
    //Has equals, hascode etc implemented. Omitted here for brevity.
   }

我的 add 方法将被多次调用,我希望通过 LINQ 查询缩短 foreach 循环。

基本上,我需要做的是按硬币值对所有硬币进行分组,然后添加到存储库中。但是,在这样做的同时,我需要与已经存在的那些合并。如何使用 LINQ 实现此目的?

例如:假设我在存储库中有 2 个价值为 1 和 2 的硬币,并且我收到另一个按值 1、2 和 3 添加硬币的请求,那么我的存储库现在将有 3 种类型的硬币。价值 1 的硬币与计数 2,价值 2 的硬币与计数 2,价值为 3 的硬币与计数 1。

谢谢-话筒

使用 .NET 3.5

这假设您有一组硬币要处理。

看起来您正在尝试构建硬币与硬币频率的字典,对吧?在这种情况下,解决方案可以在一行中陈述。

var dict = coins.GroupBy(c => c).ToDictionary(g => g.Key, g => g.Count());

相反,如果您希望创建硬币与总硬币价值的字典:

var dict = coins.GroupBy(c => c)
            .ToDictionary(g => g.Key, g => g.Sum(c => c.CoinValue));

使用 LINQ 无法实现此目的。LINQ 用于查询数据结构,而不是修改它们。

LINQ不是

执行副作用的有效工具,它是一个查询工具。 由于您尝试通过合并第二个集合来修改现有集合,因此它不是适合该作业的工具。

您的foreach循环已经非常有效,并且可能与使用 LINQ 时的任何循环一样快(或更快)。

最新更新