如何对列表既不是asc也不是desc而是自定义

时间:2013-03-01 01:31:30

标签: c# .net

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

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

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

    1,2,3

我需要将列表排序为asc或desc,而不是按3,1,2

排序

任何快捷方式都可以在不复制到其他列表的情况下执行此操作吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

奇怪的要求。 :)
无论如何,假设你只支持1,2和3,正如其他人建议你可以自己编写IComparer<T>。 e.g。

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<T>

答案 2 :(得分:0)

AFAIK List.Sort就地运作。如果您使用自定义比较运算符(如this answer中建议的那样),您可能可以达到您想要的效果:

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