如何在C#中对字典列表进行排序和"裁剪"

Nim*_*oud 3 c# linq extension-methods dictionary

我想只使用前N个列表项并删除其余项.我以为我复制并排序匹配_listTopN但是当我清除匹配时它也清除了_listTopN

简而言之,如何在无序字典列表中获取最多3个列表项并将它们放回同一个字典?

Dictionary<int, float> matches;
Run Code Online (Sandbox Code Playgroud)

...

if (matches.Count > Settings.requiredMatch)
{
   var _listTopN = matches.OrderByDescending(s => s.Value).Take(Settings.requiredMatch);

   matches.Clear();

   foreach (var p in _listTopN)
      matches.Add(p.Key, p.Value);

}
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 5

Linq查询被懒惰地评估.您分配的语句_listTopN不执行任何工作,它只准备查询; 只有在开始枚举结果时才会执行此查询.由于matches在开始枚举查询之前清除了,因此源中没有任何内容可以枚举...

如果您希望急切地评估查询,请ToList在最后添加:

var _listTopN = matches.OrderByDescending(s => s.Value)
                       .Take(Settings.requiredMatch)
                       .ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用ToDictionary在单个查询中执行所有工作:

matches = matches.OrderBy(s => s.Value)
                 .Take(Settings.requiredMatch)
                 .ToDictionary(s => s.Key, s => s.Value);
Run Code Online (Sandbox Code Playgroud)