c# - 字典列表排序

标签 c# linq sorting collections

我有一组需要排序的字典值(List<>)。基本上每个字典都是一个“行”,集合是一页行。一个简单的例子;

       var data = new List<Dictionary<string,string>>();
       data.Add(new Dictionary<string,string>() {
                    { "Firstname", "Bob"},
                    { "Lastname", "Banana"}
       });
       data.Add(new Dictionary<string, string>() {
                    { "Firstname", "Amy"},
                    { "Lastname", "Apple"}
       });
       data.Add(new Dictionary<string, string>() {
                    { "Firstname", "Charlie"},
                    { "Lastname", "Coconut"}
       });
       data.Add(new Dictionary<string, string>() {
                    { "Firstname", "Andy"},
                    { "Lastname", "Apple"}
       });

生成的排序字符串类似于“SQL”,例如

 Lastname asc, Firstname desc

我试过了.OrderBy()在数据对象上,但这似乎不适用于 KeyValuePairs。

知道如何使用动态排序语句让数据列表按此顺序排序:

 Apple, Andy
 Apple, Amy
 Banana, Bob
 Coconut, Charlie

如果一些奇特的 LINQ 可以工作,则使用 .NET 4.0。感谢您的任何建议。

最佳答案

data.OrderBy(dict => dict["Lastname"])
    .ThenByDescending(dict => dict["Firstname"])

如果是动态的:

var sorted = data.OrderBy(item => 1); // identity (stable) sort
orderby = "Lastname asc, Firstname desc";
foreach (var key in orderby.Split(',').Select(clause => clause.Trim()))
{
    if (key.EndsWith(" desc", StringComparison.CurrentCultureIgnoreCase))
    {
        key = key.Substr(0, key.Length - 5);
        sorted = data.ThenByDescending(dict => dict[key]);
    } else
    {
        if (key.EndsWith(" asc", StringComparison.CurrentCultureIgnoreCase)) 
        {
            key = key.Substr(0, key.Length - 4);
        }
        sorted = data.ThenBy(dict => dict[key]);
    }
}

关于c# - 字典列表排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499882/

相关文章:

c# - Visual Studio for Mac 中的自动保存

c# - 使用 LINQ 进行全文搜索

C# - 带有 OR 子句的 LINQ 语句

c# - 在 C# 中运行 PowerShell 文件,如何以 ASP.NET 形式执行?

c# - 有没有办法在 C# 中使用 Label 对象创建行分隔符?

c# - 具有多字符替换的字符串组合

c# - Linq to Entities 4.0 - 优化查询并在单个查询中多次调用数据库

json - 如何使用jq按日期时间字段排序?

delphi - 对 TDictionary 进行排序

c - 数组互相取值?