如何在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 ++中?
答案 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方法用于将对象与其他对象进行比较。它返回一个数字:
例如:
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。