如何在C#中根据连续两个条件对列表进行排序? [已关闭]

问题描述 投票:0回答:2

我有课:

public class Car
{
   public int Year;
   public int Speed;

   public Car(int year, int Speed)
   {
      Year = year;
      Speed = speed;
   }
}

我有一份汽车清单。

list<Car> cars = new list<Car>()
   {
       new Car(2023, 120),
       new Car(2023, 180),
       new Car(2022, 130),
       new Car(2023, 150),
       new Car(2021, 200),
       new Car(2022, 110)
   };

我想首先根据年份对列表进行排序,然后根据速度对列表进行排序。因此,较新的汽车比速度更重要。所以最终的结果应该是这样的:

   Car(2023, 180),
   Car(2023, 150),
   Car(2023, 120),
   Car(2022, 130),
   Car(2022, 110),
   Car(2021, 200)

我怎样才能在 C# 中实现这一目标,并且最好不使用 system.linq?

我尝试了 linq 但无法实现这种排序。

c# sorting
2个回答
0
投票

您始终可以编写自己的

IComparer<T>
实现来根据需要比较对象。只需确保您的比较器满足规则:自反性、反对称性和传递性。

 public int Compare(Car x, Car y)
{
    if(x.Year == y.Year){
        return x.Speed.CompareTo(y.Speed);
    return x.Year.CompareTo(y.Year);
}

我怎样才能在 C# 中实现这一目标,并且最好不使用 system.linq?

如果您有性能问题,您应该在做出“linq 太慢”之类的结论之前验证您的假设。虽然 linq 会有一些开销,但对于小型列表来说可能并不重要,而对于较大的列表,您可能应该尝试保持列表排序。所以我会首先使用

OrderBy
ThenBy
,并测量是否足够快


0
投票

如果您想对 就地排序(即“不使用 Linq”),您可以使用

Sort
:

cars.Sort((a, b) => {
  int compare = a.Year.CompareTo(b.Year);

  return compare == 0
    ? b.Speed.CompareTo(a.Speed)
    : compare;
});
© www.soinside.com 2019 - 2024. All rights reserved.