【问题标题】:List.Sort (Custom sorting...)List.Sort(自定义排序...)
【发布时间】:2011-03-08 08:39:53
【问题描述】:

我有一个 List 对象,其中包括 3 个项目:Partial、Full To H 和 Full To O。

我将此列表绑定到一个 asp OptionButtonList,并按字母顺序对其进行排序。但是,我想对列表进行如下排序:

全到 H,部分,全到 O。

我怎样才能做到这一点?

【问题讨论】:

  • 什么是“全到 H,部分,全到 O”?请添加一些您目前拥有的代码。
  • 如果你觉得它最有用,记得接受一个答案

标签: c# sorting


【解决方案1】:

Linq 非常适合这个。您甚至可以构建订单序列以动态定义它,因为直到ToList 才会执行排序。

 var sortedList = yourList.OrderBy(i => i.FullToH).
     ThenBy(i => i.Partial).
     ThenBy(i => i.FullToO).ToList();

【讨论】:

  • Linq 有一个很大的缺点:它不能在不产生内存开销的情况下对列表进行排序。
【解决方案2】:

感谢大家的帮助!

我是这样做的:

List<string> sortedList = new List<string>();
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList();

然后绑定到sortedList!

【讨论】:

  • 第一行的分配是不必要的。这更好: List sortedList = list.OrderBy.....
【解决方案3】:

好的,我知道这已经有几年历史了,但我有一个替代解决方案,我认为它比未来读者可能想要考虑的上述解决方案更优雅:

在你的课堂上:

static readonly List<String> codeValueSortOrder = new List<String> {
    "Full To H", 
    "Partial",
    "Full To O"
};

在你的方法中:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue));

【讨论】:

  • 注意:对于实际代码,使用 Dictionary 而不是 codeValueSortOrder 列表进行 O(1) 搜索和总体 O(n log n) 与 Dictionary[value] 而不是 O(n^2 log n) 与List.IndexOf
【解决方案4】:

您列出的项目(例如 FullToHo)只是字符串吗?如果是这样,那么您需要做的就是编写一个方法来进行比较并使用该方法进行排序。

public int CompareEntries(string left, string right) {
  const string fullToH = "Full To H";
  const string partial = "Partial";
  const string fullToO = "Full To O";
  if ( left == right ) {
    return 0;
  } else if ( left == fullToH ) {
    return -1;
  } else if ( left == fullToO ) {
    return 1;
  } else if ( right == fullToH ) {
    return 1;
  } else {
    return -1; 
  }
}

list.Sort(CompareEntries);

【讨论】:

  • 最干净和最通用的解决方案,适合我们不想将我们的比较压缩成单行。
【解决方案5】:

假设你的列表不是

 List<object> myList = new List<object>();

但是,类似

List<MyObjectClass> myList = new List<MyObjectClass>();

(其中每个元素都是相同的对象类型)

你可以这样做:

myList.Sort((firstObj, secondObj) =>
    {
        return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty);
    }
);

【讨论】:

    【解决方案6】:
    【解决方案7】:

    为您的自定义类型(实现 IComparer 接口)创建一个比较器。然后您可以使用它对列表进行排序:

    List<CustomType> list = new List<CustomType>();
    
    // Fill list
    list.Sort(new CustomComparer());
    

    或者,如果您使用的是较新版本的框架并且不需要重新使用排序逻辑,则可以使用IEnumerable&lt;T&gt;.OrderBy() 方法。

    【讨论】:

      【解决方案8】:

      假设您有字符串项目,并且您希望按其他列表优先级对它们进行优先级排序。 这是我的示例,其中我有优先级列表,这些优先级将按优先级排列在排序列表中。

      结果

      kitty , some item , kk abb , ccc , kk abc, some flash
      
      class Program
          {
              static void Main(string[] args)
              {
                  Console.WriteLine("Hello World!");
                  var input = new List<string>()
                  {
                      "some item",
                      "some flash",
                      "kitty",
                      "ccc",
                      "kk abc",
                      "kk abb"
      
                  };
      
                  var sorted = input.OrderBy(x => x, new Comparer()).ToList();
      
                  Console.ReadKey();
              }
          }
      
          public class Comparer : IComparer<string>
          {
              private List<KeyValuePair<string, int>> priorities = new List<KeyValuePair<string, int>>()
              {
                  new KeyValuePair<string, int>("some item", 2),
                  new KeyValuePair<string, int>("kitty", 1),
                  new KeyValuePair<string, int>("kk abb", 3),
              };
              public int Compare(string x, string y)
              {
                  var anyX = priorities.Any(z => z.Key == x);
                  var anyY = priorities.Any(z => z.Key == y);
                  if (anyX || anyY)
                  {
                      var firstX = priorities.FirstOrDefault(z => z.Key == x);
                      var firstY = priorities.FirstOrDefault(z => z.Key == y);
                      if (anyX && anyY)
                      {
                          if (firstX.Value > firstY.Value)
                          {
                              return firstX.Value;
                          }
      
                          return -firstX.Value;
                      }
      
                      if (anyX)
                      {
                          return -firstX.Value;
                      }
      
                      if (anyY)
                      {
                          return firstY.Value;
                      }
      
                  }
      
      
                  return string.Compare(x, y, StringComparison.Ordinal);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 2014-07-18
        • 2011-12-16
        • 2012-01-01
        • 2011-01-11
        • 2014-04-29
        相关资源
        最近更新 更多