在C#中排序对象数组(相当于std :: sort)

时间:2016-07-17 18:34:41

标签: c# sorting

如何在c#中对字符串数组进行排序,我想在C ++中使用类似std :: sort的东西:

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

我需要对对象列表进行排序。列表中的对象是Genome类的实例。我在该类中重载了运算符< 和运算符>

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

}

这是宣布人口的方式:

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

如何对此数组进行排序?可以使用运算符重载运算符&lt;喜欢在C ++中?

3 个答案:

答案 0 :(得分:4)

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

或:

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

答案 1 :(得分:2)

与依赖operator<进行排序的C ++不同,C#依赖于您的类实现IComparable<T>,或者将外部比较器传递给Sort方法:

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

是否可以使用<的运算符重载,就像在C ++中一样?

IComparable<T><稍微复杂一些,因为它在对象相等时返回零。您可以使用<>表达相同的逻辑,但直接实现IComparable<T>接口更容易。

答案 2 :(得分:1)

您定义对象顺序(&lt;和&gt;)的方式不适合C#。

您需要实现IComparable接口。它只有一种方法:

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

CompareTo方法用于将对象与其他对象进行比较。它返回一个数字:

  1. less 0.当前对象将位于参数
  2. 中的对象之前
  3. 等于0.两个对象相等
  4. 超过0.当前对象将位于参数
  5. 中的对象之后

    例如:

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

    在你的情况下,你只需要返回this.fitness-p.fitness。