2

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

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

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

    1,2,3

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

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

4

3 回答 3

2

使用采用自定义比较器的 List.Sort的重载。请参阅此MSDN 页面上的代码示例:

于 2013-03-01T01:40:21.293 回答
1

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

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

于 2013-03-01T02:05:40.997 回答
0

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

lCustomClasses.Sort((x, y) => my_compare(x.MyField, y.MyField));
于 2013-03-01T01:40:28.480 回答