带有IComparer和Array.Sort的C#Lambda表达式(从Java转换为C#)
我正在尝试将使用带有IComparer和Array.Sort的C#Lambda表达式(从Java转换为C#),java,c#,lambda,Java,C#,Lambda,我正在尝试将使用Comparator接口的lambda表达式从Java转换为C。我得到了以下错误: 无法将lambda表达式转换为类型 “System.Collections.IComparer”,因为它不是委托类型 我试图切换到比较,但它不适用于我的数组。排序方法: Array.Sort(Population, Population[0].Comparator); Array.Sort(population, 0, population.Length, population[0].Compar
Comparator
接口的lambda表达式从Java转换为C。我得到了以下错误:
无法将lambda表达式转换为类型
“System.Collections.IComparer
”,因为它不是委托类型
我试图切换到比较
,但它不适用于我的数组。排序
方法:
Array.Sort(Population, Population[0].Comparator);
Array.Sort(population, 0, population.Length, population[0].Comparator);
PregancyIndividual实现IGeneticIndividual接口
public virtual IGeneticIndividual[] selectPopulation(IGeneticIndividual[] population)
{
IGeneticIndividual[] res = new IGeneticIndividual[population.Length];
Array.Sort(population, 0, population.Length, population[0].Comparator);
以下是我的Java代码:
@Override
public Comparator getComparator() {
Comparator<PregnancyIndividual> IndividualFitnessComparator
= (PregnancyIndividual ind1, PregnancyIndividual ind2) -> {
int res = 1;
double fitness1 = ind1.getFitnessCalculator().calculateFitness(ind1);
double fitness2 = ind2.getFitnessCalculator().calculateFitness(ind2);
if (fitness1 > fitness2) {
return -1;
}
if (fitness1 == fitness2) {
return 0;
}
return res;
};
return IndividualFitnessComparator;
}
我现在正在尝试实现我的C#代码:
公共虚拟IComparer比较器
{
得到
{
//
IComparer IndividualFitness Comparator=(妊娠个体ind1,妊娠个体ind2)=>
{
int res=1;
double fitness1=ind1.FitnessCalculator.calculateFitness(ind1);
double fitness2=ind2.FitnessCalculator.calculateFitness(ind2);
如果(适用性1>适用性2)
{
返回-1;
}
如果(fitness1==fitness2)
{
返回0;
}
返回res;
};
返回个体适应性比较器;
}
}
将您的PregnacyIndividual类更改为实现Icomparer并实现Compare,如下所示:
class PregnancyIndividual : IComparer
{
int IComparer.Compare(object a, object b)
{
PregnancyIndividual ind1 = (PregnancyIndividual)a;
PregnancyIndividual ind2 = (PregnancyIndividual)b;
int res = 1;
double fitness1 = ind1.FitnessCalculator.calculateFitness(ind1);
double fitness2 = ind2.FitnessCalculator.calculateFitness(ind2);
if (fitness1 > fitness2)
{
return -1;
}
if (fitness1 == fitness2)
{
return 0;
}
return res;
}
}
“但它不适用于我的数组。排序方法”-会发生什么?(“它不起作用”并不能告诉我们太多。)你应该使用
比较,在这一点上它应该是好的。。。另外,通过返回fitness2.CompareTo(fitness1)
,您可以使您的方法简单得多。我删除了我的答案以编写一个新的答案,请让我理解,您想要比较2个怀孕个体,对吗?是的,两个怀孕个体类。PregnanceInDividual实现接口IGeneticIndividual。我将该接口用于数组。排序:公共虚拟IGeneticIndividual[]选择填充(IGeneticIndividual[]填充){IGeneticIndividual[]res=新IGeneticIndividual[population.Length];数组。排序(填充,0,填充。长度,填充[0]。比较器);请检查我的答案,它应该对您有用。我如何将它与我的公共虚拟IComparer比较器{get{
?类似IComparer IndividualFitnessComparator;IndividualFitnessComparator.Compare(怀孕个体ind1,怀孕个体ind2);return IndividualFitnessComparator;
?为什么需要返回IComparer?您实际上并没有按原样使用它,而是希望对怀孕数组进行排序,这就是您需要它来实现IComparer接口的原因。
public virtual IComparer Comparator
{
get
{
//<PregnancyIndividual>
IComparer IndividualFitnessComparator = (PregnancyIndividual ind1, PregnancyIndividual ind2) =>
{
int res = 1;
double fitness1 = ind1.FitnessCalculator.calculateFitness(ind1);
double fitness2 = ind2.FitnessCalculator.calculateFitness(ind2);
if (fitness1 > fitness2)
{
return -1;
}
if (fitness1 == fitness2)
{
return 0;
}
return res;
};
return IndividualFitnessComparator;
}
}
class PregnancyIndividual : IComparer
{
int IComparer.Compare(object a, object b)
{
PregnancyIndividual ind1 = (PregnancyIndividual)a;
PregnancyIndividual ind2 = (PregnancyIndividual)b;
int res = 1;
double fitness1 = ind1.FitnessCalculator.calculateFitness(ind1);
double fitness2 = ind2.FitnessCalculator.calculateFitness(ind2);
if (fitness1 > fitness2)
{
return -1;
}
if (fitness1 == fitness2)
{
return 0;
}
return res;
}
}