【问题标题】:C# Dictionary SortingC# 字典排序
【发布时间】:2015-01-23 23:12:52
【问题描述】:

当我尝试在遍历之前对字典进行排序时,它不起作用。我相信这是因为 C# 中的字典是不可变的?有什么解决办法吗?

if (arrFilter[i].strTitle.Equals("test")) {
    arrFilter[i].dicValue.OrderBy(j => j.Key, new AlphaNumericComparator());
    } else {
    arrFilter[i].dicValue.OrderBy(j => j.Key, new numComp());
}

foreach (var item in arrFilter[i].dicValue.OrderBy(j => j.Key, new AlphaNumericComparator())) {
// Traversing stuff

}

【问题讨论】:

  • 1. 请在您的代码 sn-p 中包含变量声明(例如 arrFilter 和包含 strTitle 和 dicValue 成员的类型)。 2. 你说“它不起作用”到底是什么意思?

标签: c# sorting dictionary


【解决方案1】:

您使用的OrderBy 方法是一种LINQ 扩展方法,在本例中返回IEnumerable<KeyValuePair<,>>。它不会对字典进行适当的排序,也不会返回已排序的字典。它只是枚举字典并返回一个排序的枚举。这就是为什么你必须在遍历时调用它(或者至少在遍历时使用它的返回值)。

还要注意字典是可变的(与您的看法相反)。但是,它的顺序不受您的控制。如果你想控制排序,你可以考虑使用SortedDictionary<,>。

【讨论】:

  • 要非常迂腐,“返回排序的可枚举”应该是“返回可枚举的,当/如果枚举时最终返回排序的项目”。当您在获取dictionary.OrderBy(...) 的结果和实际枚举之间向字典中添加项目时,它也令人惊讶地不会失败......
【解决方案2】:

您可以简单地将您的 Dictionary 转换为 List。本质上:

// var (List<KeyValuePair<string, string>>
var container = myDictionary.ToList();    
container.Sort((index, nextIndex) =>
{
     return index.Value.CompareTo(nextIndex.Value);
});

这将提供 Sort 或 Order 功能,这些功能尚未包含在 Dictionary Collection 中。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多