【问题标题】:How to sort a list neither asc or desc but custom [duplicate]如何对列表进行排序,既不是 asc 也不是 desc,而是自定义 [重复]
【发布时间】:2013-03-01 01:31:30
【问题描述】:

我需要对列表内的对象实例中的属性进行排序,如下所示:

    public List<CustomClass> lCustomClasses = new List<CustomClass>();

CustomClass 有一个属性 MyField,它可以具有以下值之一:

    1,2,3

我需要对列表进行排序,而不是 asc 或 desc,而是按 3、1、2 排序

在不复制到另一个列表的情况下执行此操作的任何快捷方式?

【问题讨论】:

标签: c# .net


【解决方案1】:

使用 List.Sort 的 overload 接受自定义比较器。请参阅this MSDN 页面上的代码示例:

【讨论】:

    【解决方案2】:

    奇怪的要求。 :)
    无论如何,假设您只支持 1、2 和 3,正如其他人建议的那样,您可以编写自己的 IComparer&lt;T&gt;。例如

    class Program
    {
        static void Main(string[] args)
        {
            List<CustomClass> list = new List<CustomClass>() 
            {
                new CustomClass(){MyField = 3},
                new CustomClass(){MyField = 2},
                new CustomClass(){MyField = 1},
            };
            PrintList(list);
            list.Sort(new CustomClassComparer());
            PrintList(list);
            Console.ReadLine();
        }
        private static void PrintList(List<CustomClass> list)
        {
            foreach (var item in list)
            {
                if (item != null)
                    Console.WriteLine("MyField: {0}", item.MyField);
                else
                    Console.WriteLine("MyField: null");
            }
        }
    }
    
    public class CustomClass
    {
        public int MyField { get; set; }
    }
    public class CustomClassComparer : IComparer<CustomClass>
    {
        public int Compare(CustomClass x, CustomClass y)
        {
            if (x == null)
            {
                if (y == null)
                    return 0;
                return -1;
            }
            if (y == null)
                return 1;
    
            if (x.MyField == y.MyField)
                return 0;
    
            if (x.MyField == 2)
                return 1;
            if (x.MyField == 1)
                if (y.MyField == 3)
                    return 1;
                else
                    return -1;
    
            return -1;
        }
    }
    

    或者,您可以将CustomClass IComparable&lt;T&gt; 设为。

    【讨论】:

      【解决方案3】:

      AFAIK List.Sort 就地运行。如果您使用自定义比较运算符,如this answer 中建议的那样,您可能能够实现您想要的:

      lCustomClasses.Sort((x, y) => my_compare(x.MyField, y.MyField));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-26
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        相关资源
        最近更新 更多