wake-up-neo.net

Sortieren einer Liste von Objekten in C #

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

  public String CarMaker { get; set; }

  public DateTime CreationDate { get; set; }
}

Dies ist eine Liste, und ich versuche, einen effizienten Weg zu finden, um diese Liste zu sortieren. Liste CarList, die 6 (oder einen beliebigen ganzzahligen Betrag) Autos enthält, nach dem Datum der Fahrzeugherstellung. Ich wollte Bubble sortieren, aber wird das funktionieren? Irgendeine Hilfe?

Vielen Dank

37
Mike Gallager

Die List<T>-Klasse macht dies für Sie einfach, da sie eine Sort-Methode enthält. (Es wird der QuickSort-Algorithmus verwendet, nicht Bubble Sort, was normalerweise ohnehin besser ist.) Noch besser: Es gibt eine Überladung, die ein Comparison<T>-Argument benötigt, was bedeutet, dass Sie einen Lambda-Ausdruck übergeben können und die Dinge in der Tat sehr einfach machen.

Versuche dies:

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

Sie könnten LINQ verwenden:

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

BEARBEITEN: Mit diesem Ansatz können mehrere Sortierspalten einfach hinzugefügt werden:

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

Am besten implementieren Sie entweder IComparable oder IComparable<T> und rufen dann List<T>.Sort() auf. Dies erledigt die ganze harte Sortierarbeit für Sie.

16
Andy

Eine andere Option wäre, einen benutzerdefinierten Vergleicher zu verwenden:

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
   }
}

was du so anrufst:

yourCarlist.Sort(new CarNameComparer());

Hinweis: Ich habe diesen Code nicht kompiliert, daher müssen Sie möglicherweise Typos entfernen

Bearbeiten: Es wurde so geändert, dass der Vergleicher das Erstellungsdatum wie gewünscht vergleicht.

14
Peter

Ich würde nur den Build in List.Sort-Methode verwenden. Es verwendet den QuickSort-Algorithmus, der im Durchschnitt in O (n log n) läuft.

Dieser Code sollte für Sie funktionieren. Ich ändere Ihre Eigenschaften in Auto-Eigenschaften und definierte eine statische CompareCarSpecs-Methode, die nur die bereits vorhandene DateTime.CompareTo-Methode verwendet.

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

Hoffe das hilft.

6
Egil Hansen

Einige der hier genannten Stücke zusammenstellen. Dies kompiliert und funktioniert in C # 4.x und VS2010. Ich habe mit einer WinForm getestet. Fügen Sie also die Methode der WinFormMain() hinzu. Sie benötigen mindestens die Assemblys System.Linq und System.Generic.Collections. 

    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; }
} 
3
dpminusa

Wenn Sie nach einer effizienten Sortiermethode suchen, würde ich von der Verwendung von Bubblesortierung abraten und stattdessen eine schnelle Sortierung durchführen. Diese Seite bietet eine ziemlich gute Erklärung des Algorithmus:

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

Viel Glück!

1
Mia Clarke

Ich würde es vermeiden, meinen eigenen Sortieralgorithmus zu schreiben, aber wenn Sie trotzdem wollen, schauen Sie unter http://www.sorting-algorithms.com/ nach einigen Zusammenhängen verschiedener Sortieralgorithmen ...

1
Arjan Einbu

Wenn Sie 2.0 verwenden, kann die folgende Diskussion hilfreich sein: C # -Liste <> Nach x sortieren, dann y

1
Byron Ross

Wenn Sie Delegaten (auch als anonyme Methoden bezeichnet) verwenden, müssen Sie keine IComparer/IComparable-Schnittstellen implementieren.

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

    }
0
Mark Woodard