我需要对列表内的对象实例中的属性进行排序,如下所示:
public List<CustomClass> lCustomClasses = new List<CustomClass>();
CustomClass 有一个属性 MyField,它可以具有以下值之一:
1,2,3
我需要对列表进行排序,而不是 asc 或 desc,而是按 3、1、2 排序
在不复制到另一个列表的情况下执行此操作的任何快捷方式?
奇怪的要求。:)
无论如何,假设您只支持 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>
.
AFAIKList.Sort
就地运作。如果您使用自定义比较运算符,如this answer中建议的那样,您可能能够实现您想要的:
lCustomClasses.Sort((x, y) => my_compare(x.MyField, y.MyField));