简体   繁体   中英

Sort array of object in C# (equivalent of std::sort)

How can I sort array of strings ascending in c#, I want use something like std::sort in C++:

 std::sort(population.begin(), population.end())

I need to sort list of obects. The objects in list are instances of Genome class. I overloaded operator < and operator > in that class.

 class Genome
{
    public List<double> weights;
    public double fitness;

    public Genome()
    {
        fitness = 0.0;
        weights = new List<double>();
    }

    public Genome(List<double> weights, double fitness) {
        this.weights = weights;
        this.fitness = fitness;
    }


    public static bool operator <(Genome lhs, Genome rhs)
    {
        return (lhs.fitness < rhs.fitness);
    }

    public static bool operator >(Genome lhs, Genome rhs) {
        return (lhs.fitness > rhs.fitness);
    }

}

This is how the population is declared:

List<Genome> population = new List<Genome>();

How can I sort this array?? Can be usede the operator overloaded operator < like in C++?

population.OrderBy(x => x.weights); 

要么:

population.OrderByDescending(x => x.fitness); 

Unlike C++ which relies on operator< for sorting, C# relies on implementation of IComparable<T> by your class, or takes an external comparer passed to Sort method:

class Genome : IComparable<Genome> {
    public int CompareTo(Genome other) {
        return fitness.CompareTo(other.fitness);
    }
}

Can operator overloaded for < be used, like in C++?

IComparable<T> is slightly more complex than < , because it returns zero when objects are equal. You can express the same logic using < and > , but it is easier to implement IComparable<T> interface directly.

The way that You are defining the order of objects (< and >) is not right for C#.

You need to realize the IComparable interface. It has only one method:

public interface IComparable
{
   int CompareTo(object o);
}

The CompareTo method is used for comparing the object with some other object. It returns a number:

  1. less 0. The current object will be before the object which is in argument
  2. equals 0. Two objects are equal
  3. More than 0. Current object will be after the object which is in argument

For example:

class Paper: IComparable
{
   public int width;
   public int height;
   public int CompareTo(object o)
   {
      Paper p = o as Paper;
      if (p!=null)
      {
          return this.width*this.height-p.width*p.height
      }
}

In Your case, You just need to return this.fitness-p.fitness.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM