在C#中对对象列表进行排序

时间:2009-05-29 11:08:44

标签: c# sorting class list

public class CarSpecs
{
  public String CarName { get; set; }

  public String CarMaker { get; set; }

  public DateTime CreationDate { get; set; }
}

这是一个列表,我试图找出一种有效的方法来排序列表CarList,包含6个(或任何整数)汽车,按汽车生产日期。我打算做冒泡排序,但那会有用吗?任何帮助?

由于

11 个答案:

答案 0 :(得分:85)

List<T>类会让您感到琐碎,因为它包含Sort method。 (它使用QuickSort算法,而不是冒泡排序,无论如何通常都更好。)更好的是,它有一个带有Comparison<T>参数的重载,这意味着你可以传递一个lambda表达式并使事情变得非常简单。

试试这个:

CarList.Sort((x, y) => DateTime.Compare(x.CreationDate, y.CreationDate));

答案 1 :(得分:57)

您可以使用LINQ:

listOfCars.OrderBy(x => x.CreationDate);

编辑:使用这种方法,可以轻松添加更多排序列:

listOfCars.OrderBy(x => x.CreationDate).ThenBy(x => x.Make).ThenBy(x => x.Whatever);

答案 2 :(得分:16)

最好的方法是实施IComparableIComparable<T>,然后调用List<T>.Sort()。这将为您排序所有艰苦的工作。

答案 3 :(得分:14)

另一种选择是使用自定义比较器:

using System;
using System.Collections.Generic;
using System.Text;

namespace Yournamespace
{
   class CarNameComparer : IComparer<Car>
   {
      #region IComparer<Car> Members

      public int Compare(Car car1, Car car2)
      {
         int returnValue = 1;
         if (car1 != null && car2 == null)
         {
            returnValue = 0;
         }
         else if (car1 == null && car2 != null)
         {
            returnValue = 0;
         }
         else if (car1 != null && car2 != null)
         {
            if (car1.CreationDate.Equals(car2.CreationDate))
            {
               returnValue = car1.Name.CompareTo(car2.Name);
            }
            else
            {
               returnValue = car2.CreationDate.CompareTo(car1.CreationDate);
            }
         }
         return returnValue;
      }

      #endregion
   }
}

你这样称呼:

yourCarlist.Sort(new CarNameComparer());

注意:我没有编译此代码,因此您可能必须删除拼写错误

编辑:对其进行修改,以便比较器按照相关要求对创建日期进行比较。

答案 4 :(得分:6)

我只想在List.Sort方法中使用构建。它使用QuickSort算法,该算法平均以O(n log n)运行。

此代码应该适合您,我将您的属性更改为自动属性,并定义了一个仅使用现有DateTime.CompareTo方法的静态CompareCarSpecs方法。

class Program
{
    static void Main(string[] args)
    {
        List<CarSpecs> cars = new List<CarSpecs>();
        cars.Sort(CarSpecs.CompareCarSpecs);
    }
}

public class CarSpecs
{
    public string CarName { get; set; }
    public string CarMaker { get; set; }
    public DateTime CreationDate { get; set; }

    public static int CompareCarSpecs(CarSpecs x, CarSpecs y)
    {
        return x.CreationDate.CompareTo(y.CreationDate);
    }
}

希望这有帮助。

答案 5 :(得分:3)

将这里提到的一些部分放在一起。这在C#4.x和VS2010中编译和工作。我用WinForm进行了测试。因此,请将方法添加到WinForm Main()。您至少需要System.LinqSystem.Generic.Collection个程序集。

    private void SortCars()
    {
        List<CarSpecs> cars = new List<CarSpecs>();
        List<CarSpecs> carsSorted = new List<CarSpecs>();

        cars.Add(new CarSpecs
        {
            CarName = "Y50",
            CarMaker = "Ford",
            CreationDate = new DateTime(2011, 4, 1),
        });

        cars.Add(new CarSpecs
        {
            CarName = "X25",
            CarMaker = "Volvo",
            CreationDate = new DateTime(2012, 3, 1),
        });

        cars.Add(new CarSpecs
        {
            CarName = "Z75",
            CarMaker = "Datsun",
            CreationDate = new DateTime(2010, 5, 1),
        });

        //More Comprehensive if needed  
        //cars.OrderBy(x => x.CreationDate).ThenBy(x => x.CarMaker).ThenBy(x => x.CarName);

        carsSorted.AddRange(cars.OrderBy(x => x.CreationDate));

        foreach (CarSpecs caritm in carsSorted)
        {
            MessageBox.Show("Name: " +caritm.CarName 
                + "\r\nMaker: " +caritm.CarMaker
                + "\r\nCreationDate: " +caritm.CreationDate);
        }
    }
}

public class CarSpecs
{
    public string CarName { get; set; }
    public string CarMaker { get; set; }
    public DateTime CreationDate { get; set; }
} 

答案 6 :(得分:1)

如果您正在采用有效的排序方式,我建议不要使用冒泡排序,而是快速排序。该页面提供了对算法的一个很好的解释:

http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=574

祝你好运!

答案 7 :(得分:1)

我会避免编写自己的排序算法,但无论如何,请查看http://www.sorting-algorithms.com/以获取不同排序算法的一些比较...

答案 8 :(得分:1)

如果您使用的是2.0,则以下讨论可能会有用:C# List<> Sort by x then y

答案 9 :(得分:0)

如果使用委托(也称为匿名方法),则不必实现任何IComparer / IComparable接口。

public static void Main(string[] args)
    {


      List<CarSpecs> list = new List<CarSpecs>();

      list.Add(new CarSpecs("Focus", "Ford", new DateTime(2010,1, 2));
      list.Add(new CarSpecs("Prius", "Toyota", new DateTime(2012,3, 3));
      list.Add(new CarSpecs("Ram", "Dodge", new DateTime(2013, 10, 6));



        list.Sort(delegate (CarSpecs first, CarSpecs second)
        {
            int returnValue = 1;
            if((first != null & second != null))
            {
                if (first.CarName.Equals(second.CarName))
                {
                    if (first.CarMaker.Equals(second.CarMaker))
                    {
                    returnValue = first.CreationDate.CompareTo(second.CreationDate);
                    }
                    else
                    {
                    returnValue = first.CarMaker.CompareTo(second.CarMaker);
                    }
                }
                else
                {
                    returnValue = first.CarName.CompareTo(second.CarName);
                }
            }
            return returnValue;
        });

    }

答案 10 :(得分:0)

要扩展Noldorin的答案,可以使用int数据类型对列表进行排序:

listName.Sort((x, y) =>  x.CompareTo(y));

或者如果列表中有复杂对象:

inventoryList.Sort((x, y) =>  x.stockNumber.CompareTo(y.stockNumber));
相关问题