以自定义方式对列表中的项进行排序

时间:2013-08-22 09:02:20

标签: c# list

我有列表,我想循环并按固定名称排序。如果说我的列表中包含项目,

List[0] = "Banana";
List[1] = "Orange";
List[2] = "Apple";
List[3] = "Olive";

然后我想让橙色始终在顶部。 所以我的订单将是 Orange => Banana => Mango => Olive。

我只是不知道如何以自定义方式对其进行排序。

我尝试使用

list = list.OrderBy(x => x.Name).toList();  

但这会使橄榄油位于顶部。 有什么方法可以对此进行排序?有什么建议吗?

更新 如果列表中没有橙色,那么我不需要任何排序。

4 个答案:

答案 0 :(得分:5)

list = list.OrderBy(x => x.Name != "Orange").ToList();

这会将“Orange”项目移到列表顶部,因为键选择器对这些项目的值为false。对于其他项目,它将是true


您的字符串示例相同:

List.OrderBy(x => x != "Orange")

给予

Orange // false
Banana // true
Apple  // true
Olive  // true

答案 1 :(得分:1)

假设输入列表是string的列表,以下将把所有“橙色”放在开头:

var fruits = new List<string> {
    "Banana",
    "Orange",
    "Apple",
    "Olive"
};

const string Orange = "Orange";

for (int i = 0; i < fruits.RemoveAll(fr => fr == Orange); i++) {
    fruits.Insert(0, Orange);
}

Console.WriteLine(string.Join(", ", fruits));

这要求Orange s是可互换的value / valuelike对象。

答案 2 :(得分:0)

尝试将enum用于水果,并根据您的自定义将值指定给enums

public enum Fruits
{
    Orange = 1,
    Banana = 2,
    Mango = 3,
    Olive = 4
}
static void Main(string[] args)
{
    Fruits[] List = new Fruits[4];
    List[0] = Fruits.Banana;
    List[1] = Fruits.Orange;
    List[2] = Fruits.Mango;
    List[3] = Fruits.Olive;

    var sortedList = List.OrderBy(x => x);

    foreach (var item in sortedList)
    {
        Console.WriteLine(item.ToString());
    }
}

答案 3 :(得分:0)

创建您的列表,检查它是否包含“Orange”,如果它确实删除了该项目(不是基于Index以便它可以在列表中的任何位置),那么在开始时再次插入“Orange”列表。

List<string> myList = new List<string>();
myList.Add("Banana");
myList.Add("Orange");
myList.Add("Apple");
myList.Add("Olive");

if (myList.Contains("Orange"))
{
    myList.Remove("Orange");
    myList.Insert(0,"Orange");
}

假设您的“Orange”是具有属性的对象,您可能希望更改上述内容以创建该对象类型的新单个内容,其具有与原始属性相同的所有属性(有效object = {{1 }})。