字典排序列表

Cmd*_*len 5 c# linq sorting collections

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

       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"}
       });
Run Code Online (Sandbox Code Playgroud)

生成的排序字符串是“SQL”之类的,例如

 Lastname asc, Firstname desc
Run Code Online (Sandbox Code Playgroud)

我已经尝试.OrderBy()过数据对象,但这似乎不适用于 KeyValuePairs。

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

 Apple, Andy
 Apple, Amy
 Banana, Bob
 Coconut, Charlie
Run Code Online (Sandbox Code Playgroud)

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

seh*_*ehe 5

data.OrderBy(dict => dict["Lastname"])
    .ThenByDescending(dict => dict["Firstname"])
Run Code Online (Sandbox Code Playgroud)

如果是动态的:

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]);
    }
}
Run Code Online (Sandbox Code Playgroud)


age*_*t-j 3

  private static IEnumerable<Dictionary<string, string>> Sort(IEnumerable<Dictionary<string,string>> data, string orderByString)
  {
     var orderBy =
        orderByString.Split(',').Select(
           s => s.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
           .Select (a => new {Field=a[0],Descending = "desc".Equals (a[1], StringComparison.InvariantCultureIgnoreCase)})
           .ToList ();
     if (orderBy.Count == 0)
        return data;
     // First one is OrderBy or OrderByDescending.
     IOrderedEnumerable<Dictionary<string, string>> ordered =
        orderBy[0].Descending ? data.OrderByDescending (d => d[orderBy[0].Field]) : data.OrderBy (d => d[orderBy[0].Field]);
     for (int i = 1; i < orderBy.Count; i++)
     {
        // Rest are ThenBy or ThenByDescending.
        var orderClause = orderBy[i];
        ordered =
           orderBy[i].Descending ? ordered.ThenByDescending(d => d[orderClause.Field]) : ordered.ThenBy(d => d[orderClause.Field]);
     }
     return ordered;
  }
Run Code Online (Sandbox Code Playgroud)