【问题标题】:Sorting based on the keys in dictionary根据字典中的键排序
【发布时间】:2014-02-18 07:52:24
【问题描述】:

请找到他附上的图片。

ls 是 dicionary<string, string> 。我想根据键进行排序。但是如果键像

7020_1、7020_23、7030_5。 7020_8、7030_1。

我希望它被安排成

7020_1,7020_8,7020_23,7030_1.7030_5。

让我知道解决方案。

【问题讨论】:

  • 让我们知道您到目前为止所做的尝试。

标签: c# .net visual-studio-2010 linq predicate


【解决方案1】:

这是一个简单的解决方案。

Dictionary<string, string> d = dic.OrderBy(x => int.Parse(x.Key.Split('_')[0])).ThenBy(x => int.Parse(x.Key.Split('_')[1])).ToDictionary(j => j.Key, j => j.Value);

【讨论】:

  • 这可能适用于本示例,但您的最终对象是一个未排序的字典。如果有效,那只是实施的运气。
  • 这里很好地解释了主人的意思! Http://stackoverflow.com/questions/6384710/…
  • 感谢您的 cmets Baldrick! ;) 它们很有用!
【解决方案2】:

你应该使用:

SortedDictionary(Tkey,TValue) 并制作您的 IComparer(T) 接口,这样它就会按照您自己的规则进行排序。

更多信息:SortedDictionaryIComparer

【讨论】:

    【解决方案3】:

    这是一个演示解决方案的简短控制台应用程序:

    class KeyComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            var xSplit = x.Split('_').Select(i => Convert.ToInt32(i)).ToArray();
            var ySplit = y.Split('_').Select(i => Convert.ToInt32(i)).ToArray();
            var diff1 = xSplit[0] - ySplit[0];
            return diff1 != 0 ? diff1 : xSplit[1] - ySplit[1];
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var comparer = new KeyComparer();
            var sortedDic = new SortedDictionary<string, object>(comparer)
            {
                {"7020_23", new object()},
                {"7030_1", new object()},
                {"7030_5", new object()},
                {"7020_8", new object()},
                {"7020_1", new object()}
            };
    
            foreach (var key in sortedDic.Keys)
            {
                Console.WriteLine(key);
            }
        }
    }
    

    输出是:

    7020_1 
    7020_8 
    7020_23 
    7030_1 
    7030_5
    

    请注意,此解决方案假定密钥始终由可解析为整数的 2 部分组成,并用下划线分隔。

    【讨论】:

      【解决方案4】:

      您需要创建自己的Comparer 以传递给OrderBy,因为您需要进行整数比较而不是字符串。我使用了List,但这并没有改变。

          static void Main(string[] args)
          {
              var d = new List<string>() { "7020_8", "7030_5", "7020_23", "7020_1", "7030_1" };
      
              Console.WriteLine("In:");
              foreach (string s in d)
                  Console.WriteLine(s);
      
              Console.WriteLine();
      
              Console.WriteLine("Sorted Out:");
              foreach (string s in d.OrderBy(f => f, new MyComparer()))
                  Console.WriteLine(s);
      
              Console.ReadLine();
          }
      
          internal class MyComparer : IComparer<string>
          {
      
              #region IComparer<string> Members
      
              public int Compare(string x, string y)
              {
                  //return <0 if x < y, 0 if x = y, >0 if x > y
      
                  //if the strings are equal return 0 now
                  if (x.CompareTo(y) == 0)
                      return 0;
      
                  int x1, x2;
                  int y1, y2;
                  //split the strings on _
                  x1 = Convert.ToInt32(x.Split('_')[0]);
                  x2 = Convert.ToInt32(x.Split('_')[1]);
      
                  y1 = Convert.ToInt32(y.Split('_')[0]);
                  y2 = Convert.ToInt32(y.Split('_')[1]);
      
                  //compare the first part
                  if (x1.CompareTo(y1) == 0)
                      //first parts are equal so compare the second
                      return x2.CompareTo(y2);
                  else
                      return x1.CompareTo(y1);
              }
      
              #endregion
          }
      

      请注意,您显然应该改进 MyComparer 类,因为我只是假设字符串将转换为整数等。

      【讨论】:

        【解决方案5】:

        你可以拆分你的字符串解析然后排序

        【讨论】:

          猜你喜欢
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          • 2021-07-07
          • 2011-02-11
          • 1970-01-01
          相关资源
          最近更新 更多