排序字典清单 [英] Sort List of Dictionaries

查看:71
本文介绍了排序字典清单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a collection of dictionary values (a List<>) that I need to sort. Basically each dictionary is a 'row' and the collection is a page of rows. A simple example;

       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",例如

The sort string generated is "SQL" like, example

 Lastname asc, Firstname desc

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

I have tried .OrderBy() on the data object but that doesn't seem to work right against the KeyValuePairs.

任何想法,我都可以使用动态排序语句来获得要按此顺序排序的数据列表:

Any idea how I could get the data list to be sorted to be in this order, using the dynamic sort statement:

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

如果某些精美的LINQ可以使用,请使用.NET 4.0.感谢您的任何建议.

Using .NET 4.0 if some fancy LINQ will work. Thanks for any suggestions.

推荐答案

  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;
  }

这篇关于排序字典清单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆