【问题标题】:sort item in the list in customised way以自定义方式对列表中的项目进行排序
【发布时间】:2013-08-24 21:58:33
【问题描述】:

我有一个列表,我想循环并按固定名称对其进行排序。如果说我的列表中有项目,

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

然后我希望橙色始终位于顶部。 所以我的订单是Orange=>Banana=>Mango=>Olive。

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

我尝试过使用

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

但这会使橄榄油在顶部。 有什么办法可以解决这个问题?有什么建议吗?

更新 如果列表中不存在橙色,则我不需要任何排序。

【问题讨论】:

  • Remove Orange 从列表中,如果它存在,则对列表进行排序,insert Orange 作为第一个元素。
  • 您可以创建一个枚举(按照您希望项目排序的顺序放置项目),然后使用您在此处共享的相同 LINQ 查询(通过将每个枚举项目转换为 int)..因此,您的列表将是 List
  • @millimoose 你能告诉我怎么做吗?
  • @Happy ...认真的吗?这是集合操作 101。我什至链接到方法。
  • 顺便说一句,您可能希望使您的代码示例和描述保持一致。在代码中你有“apple”,然后在下一行是“mango”,然后是“olive oil”而不是“olive”。您还向我们展示了一个字符串列表,但随后您对一些 Name 属性进行了排序。

标签: c# list


【解决方案1】:
list = list.OrderBy(x => x.Name != "Orange").ToList();

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


您的字符串示例也是如此:

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

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

【讨论】:

  • 所以“香蕉”在“苹果”之前?嗯。
  • @MatthewWatson 为什么会出现这种情况?它首先出现在源代码集合中。要求仅是顶部有“橙色”项目。
  • 他说他想sort it on fixed name,我可能误解了他想对它进行排序。我猜他的意思是如果列表包含“橙色”,它应该放在前面。
  • OrderBy 只是将一个元素移动到列表的前面不是有点矫枉过正吗?比如,用 O(n log n) 替换 O(n) 操作?
  • @millimoose 它很简单,如果有几个带有“橙色”的元素就可以工作。表现?在出现问题之前永远不要优化它。它可以在四个项目列表上每周执行两次。谁知道
【解决方案2】:

假设输入列表是strings 的列表,下面会将所有“Orange”放在开头:

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));

这要求Oranges 是可互换的值/类值对象。

【讨论】:

  • 由于我们现在知道不需要排序,因此您的答案简化为if (list.Remove("Orange")) list.Insert(0, "Orange");(恕我直言,这是最好的答案)
【解决方案3】:

尝试将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());
    }
}

【讨论】:

    【解决方案4】:

    创建您的列表,检查它是否包含“橙色”,如果它确实删除了该项目(不是基于Index,因此它可能位于列表中的任何位置)然后在列表的开头再次插入“橙色” .

    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");
    }
    

    假设您的“橙色”是一个具有属性的对象,您希望更改上述属性以创建该对象类型的新单个实例,并具有与原始对象相同的所有属性(实际上是object = object)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多