Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有IComparer和Array.Sort的C#Lambda表达式(从Java转换为C#)_Java_C#_Lambda - Fatal编程技术网

带有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;
        }    
    }