【问题标题】:Sorting a list based on one its item and on custom condition根据其中一项和自定义条件对列表进行排序
【发布时间】:2012-03-11 17:42:49
【问题描述】:

我有一个列表,其中包含一个字符串和另一个列表 - 示例代码如下:

List<Config> ConfigLists; 

这里 Config 是一个包含 2 个成员的类:

  • 字符串名称
  • 列出二进制列表

其中 Binary 是另一个类。

我想根据每个列表项中包含的“名称”对“ConfigLists”列表进行排序。

有人可以指导吗?

我还想使用“名称”的子字符串进行排序,因为“名称”将包含“第 07 周”、“第 09 周”等值,其中我将用于比较的子字符串是字符串的数字部分(例如“07”、“09”等)

【问题讨论】:

    标签: c# list sorting element


    【解决方案1】:

    Linq 应该在这里提供帮助;

    // using System.Linq;
    ConfigLists = ConfigLists.OrderBy(x => x.Name).ToList();
    

    ...当然可以用来按子串排序...

    // Skips "Week ";
    // using System.Linq;
    ConfigLists = ConfigLists.OrderBy(x => x.Name.Substring(5)).ToList();
    

    如果您有更复杂的排序顺序或希望在排序中避免使用临时字符串,您可能希望改用 IComparer 为您进行排序;

    class WeekComparer : IComparer<Config>
    {
        public int Compare(Config x, Config y)
        { 
            return string.Compare(x.Name, 5, y.Name, 5, int.MaxValue); 
        }
    }
    
    // using System.Linq;
    var weekComparer = new WeekComparer();
    ConfigLists = ConfigLists.OrderBy(x => x, weekComparer).ToList();
    

    如果您不喜欢 Linq 的语法,IComparer 也适用于“plain old”排序。

    var weekComparer = new WeekComparer();
    ConfigLists.Sort(weekComparer);
    

    【讨论】:

      【解决方案2】:

      只需将委托传递给 Sort() 成员函数,如下所示:

      List<Config> ConfigLists; 
      //...
      ConfigLists.Sort((c1,c2) => 
          int.Parse(c1.Name.Substring(5)) - int.Parse(c2.Name.Substring(5)));
      

      【讨论】:

        【解决方案3】:

        如果您实现IComparable 接口,您可以准确地决定您的自定义对象如何排序。

        返回正整数(例如 1)将堆叠在前面,返回负整数(例如 -1)将堆叠在后面。

        编辑:

        代码可能如下所示:

        public class Config : IComparable
        {
           public string Name { get; set; }
        
           // other properties
        
           public int CompareTo(object obj) {
                if (obj == null) return 1;
        
                Config otherConfig = obj as Config;
                if (otherConfig != null) 
        
                    // this is where you would place the compare logic
        
                else
                   throw new ArgumentException("Object is not a Config");
            }
        }
        

        使用这种解决方案,您将不得不在某些时候调用 list.Sort()。如果您追求效率,您可能希望在进行过程中保持集合有序(分散排序时间)。 This post 解释了这样做的选项。

        【讨论】:

        • 你能举出和我类似的例子吗?那很好啊。我的问题也是如何在 C# 中有效地使用 Icomparable 和 Comparer 的东西?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        相关资源
        最近更新 更多