【问题标题】:How do I sort a Dictionary<K, Dictionary<K,V>> using LINQ operations?如何使用 LINQ 操作对 Dictionary<K, Dictionary<K,V>> 进行排序?
【发布时间】:2012-08-26 12:11:33
【问题描述】:

我认为这可以在单个 LINQ 中完成,但无法解决。下面的表现还可以(大List上2秒)。主要是我想摆脱创建 List 只是为了排序的内存问题。需要返回 dlWord21 按第二个 int 再按第一个 int 排序。

List<DocFTSinX> docFTSinXs = new List<DocFTSinX>();
foreach (KeyValuePair<int, Dictionary<int, byte>> kvpm in dlWord21)
{
    foreach (KeyValuePair<int, byte> kvps in kvpm.Value)
    {
        docFTSinXs.Add(new DocFTSinX(kvps.Key, kvpm.Key, kvps.Value));
        //                           Word1     Word2
    }
}
dlWord21.Clear();
return docFTSinXs.OrderBy(x => x.Word1).ThenBy(x => x.Word2);

【问题讨论】:

  • 问题是你必须在某个时候创建​​一个列表,因为你正在清除你的源集合,所以枚举不起作用
  • @BobVale 以上是工作代码。 docFTSinXs 是新的,它获得了新的价值。因此我的记忆问题。
  • 我的意思是,如果你避免创建一个列表,那么你就不能调用dlWord21.Clear(),因为枚举可能会在 clear() 之后发生延迟。因此需要创建一个列表。
  • @BobVale 来吧,你真的认为我会用 dlWord21.Clear() 将尼克的出色回答放在前面?这些问题是“在一个 LINQ 中完成的”。我把 dlWord21.Clear();在我的问题中强调内存管理问题以及我正在返回一个新对象。

标签: .net linq sorting dictionary


【解决方案1】:

你想使用SelectMany:

return dlWord21.SelectMany(o => o.Value, (x, y) => new DocFTSinX(y.Key, x.Key, y.Value))
               .OrderBy(x => x.Word1)
               .ThenBy(x => x.Word2);

【讨论】:

  • 唯一的问题可能是源代码中的dlWord21.Clear()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多