繁体   English   中英

具有IComparer和Array.Sort的C#Lambda表达式(从Java转换为C#)

[英]C# Lambda expression with IComparer and Array.Sort (converting from Java to C#)

我正在尝试将使用Comparator接口的lambda表达式从Java转换为C#。 我收到以下错误:

无法将lambda表达式转换为类型' System.Collections.IComparer ',因为它不是委托类型。

我试图切换到Comparison<T> ,但是它不适用于Array.Sort方法:

Array.Sort(Population, Population[0].Comparator);
Array.Sort(population, 0, population.Length, population[0].Comparator);

PregancyIndi​​vidual实现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;
}

PregnancyIndividual实现我自己的界面:

public class PregnancyIndividual implements IGeneticIndividual

我现在正在尝试为C#实现我的代码:

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

更改您的PregnancyIndi​​vidual类以实现Icomparer并实现以下比较:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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