0

我的类定义如下:

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

4

3 回答 3

1

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

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

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

相反,如果您正在寻找创建 coin 与总 CoinValue 的字典:

var dict = coins.GroupBy(c => c)
            .ToDictionary(g => g.Key, g => g.Sum(c => c.CoinValue));
于 2013-09-19T23:36:24.760 回答
0

使用 LINQ 无法实现这一点。LINQ 用于查询数据结构,而不是修改它们。

于 2013-09-19T23:38:58.853 回答
0

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

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

于 2013-09-19T23:41:49.027 回答