代码之家  ›  专栏  ›  技术社区  ›  Kache

将IOrderedEnumerable<KeyValuePair<string,int>>转换为字典<string,int>

  •  36
  • Kache  · 技术社区  · 14 年前

    我在跟踪 answer to another question

    // itemCounter is a Dictionary<string, int>, and I only want to keep
    // key/value pairs with the top maxAllowed values
    if (itemCounter.Count > maxAllowed) {
        IEnumerable<KeyValuePair<string, int>> sortedDict =
            from entry in itemCounter orderby entry.Value descending select entry;
        sortedDict = sortedDict.Take(maxAllowed);
        itemCounter = sortedDict.ToDictionary<string, int>(/* what do I do here? */);
    }
    

    Visual Studio正在请求参数 Func<string, int> keySelector . 我试着在网上找到几个半相关的例子,然后把它们放进去 k => k.Key ,但这会导致编译器错误:

    'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,int>>' 不包含“ToDictionary”和“best”的定义 'System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)' 有一些无效参数

    3 回复  |  直到 7 年前
        1
  •  59
  •   Rotsor    14 年前

    这个是正确的:

    sortedDict.ToDictionary<KeyValuePair<string, int>, string, int>(pair => pair.Key, pair => pair.Value);
    

    短版本为:

    sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value);
    
        2
  •  9
  •   CB01    14 年前

    我认为将两者结合在一起最干净的方法是:对词典进行排序并将其转换回词典:

    itemCounter = itemCounter.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
    
        3
  •  -1
  •   Dipesh Bhanani    8 年前

    问题太老了,但还是想给出答案供参考:

    itemCounter = itemCounter.Take(maxAllowed).OrderByDescending(i => i.Value).ToDictionary(i => i.Key, i => i.Value);