簡體   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