2013-05-26 50 views
1

我试图按通用值排序字典对象。按通用值排序字典

这里是我的代码

Dictionary<string, ReportModel> sortedDic = new Dictionary<string, ReportModel>(); 
Dictionary<string, ReportModel> rDic = new Dictionary<string, ReportModel>(); 
var ordered = sortedDic.OrderByDescending(x => x.Value.totalPurchase); 
foreach (var item in ordered) 
{       
    rDic.Add(item.Key, item.Value); 
} 

变量,有序的,只是有相同的顺序一样sortedDic。 这有什么问题? 有什么想法?

+1

什么类型是totalPurchase? –

+0

你得到的错误是什么? –

+0

如何将项目添加到'sortedDic'?它碰巧是从最高到最低的总购买量? –

回答

4

发生这种情况是因为Dictionary通常是一个无序的容器*。当您将数据放入rDic时,它会再次变为无序。

要保留所需的顺序,您需要将结果放入明确保留您提供的顺序的容器中。例如,你可以使用一个列表的KeyValuePair<string,ReportModel>,像这样:

IList<KeyValuePair<string,ReportModel>> ordered = sortedDic 
    .OrderByDescending(x => x.Value.totalPurchase) 
    .ToList(); 


*由于 Dictionary<K,V>是由微软, it happens to retain the insertion order实现的方式,但这是偶然和无证,因此它可能会改变在未来的版本中,不应该依赖。

+0

我测试了上面的代码,它在我的场景中工作。我真幸运吗? –

+1

@LuisFilipe这是没有运气,这是一个未记录的实现细节,我在脚注中提到的答案([点击此链接了解更多信息](http://stackoverflow.com/a/976871/335858 ))。 – dasblinkenlight

+0

谢谢!真棒解决方案。精美的作品! – user1713153

0

将项目添加回字典时,它不会保留其顺序。 您可以:

  1. 使用following implementation
  2. 使用下表中的列表。

    IEnumrable> lst= 
        sortedDic.OrderByDescending(x => x.Value.totalPurchase).ToArray();
  3. [编辑]如果你不介意的关键变化,那么你可以使用SortedDictionary <,>。

+0

.Net Framework已经为这样的事物提供了'SortedDictionary <,>'数据类型。 –

+0

是的,我不认为他想要改变的关键,但这是正确的。我会补充一点。 – WhyMe