List.OrderByDescending导致重复

时间:2013-12-30 21:11:22

标签: c# linq

这是我的代码

var peaks = FindPeaks(lfw, peakwidth);


var peaksordered = peaks.OrderByDescending(x => x.Value)
  .ThenBy(x => x.Frequency)
  .Distinct().ToList();

foreach (var mmm in peaksordered)
{
    Console.WriteLine(mmm.Frequency + ";" + mmm.Value);

}
return;

FindPeaks返回List<FrequencyValue>,看起来像这样

public class FrequencyValue
{
    public double Frequency { get; set; }
    public double Value { get; set; }
}

将foreach与peaks一起使用时,我会得到类似

的内容
12,3;0,4
14,5;0,7
...

应该如此。但是,如果我按照提到的方式使用它,我只得到一个结果 - 或 - 如果我省略.Distinct()我会得到像

12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
12,3;0,4
....

仅重复。订购时需要更改什么?

PS:Findpeaks:

    public static IEnumerable<FrequencyValue> FindPeaks(IEnumerable<FrequencyValue> lfw, int width)
    {
        FrequencyValue peak = new FrequencyValue();
        peak.Value = 0;
        int decay = 0;

        foreach (var value in lfw)
        {
            if (value.Value > peak.Value || decay > width / 2)
            {
                peak.Value = value.Value;
                peak.Frequency = value.Frequency;
                decay = 0;
            }
            else
                decay++;

            if (decay == width / 2)
                    yield return peak;
        }
    }

2 个答案:

答案 0 :(得分:1)

你有两个错误互相取消。这非常令人困惑。

订购很好。您的Distinct正在进行参考比较,因此不会删除重复项。实施IEquatable<Frequenz_und_Wert>并覆盖GetHashCode

此外,您始终从FindPeaks返回相同的对象实例。这就是为什么Distinct似乎有效(尽管不是你需要的方式)。它只是将整个列表折叠为一个项目(唯一不同的项目)。

foreach恰好适合您,因为打印是在yield return之间发生的。循环将始终从同一对象打印,但在迭代之间对对象进行修改。

Frequenz_und_Wert peak = new Frequenz_und_Wert();移动到循环中,为每次迭代创建一个新项目。

答案 1 :(得分:1)

您的FindPeaks应如下所示:

public static IEnumerable<Frequenz_und_Wert> FindPeaks(IEnumerable<Frequenz_und_Wert> lfw, int breite)
{
    int decay = 0;

    Frequenz_und_Wert peak = new Frequenz_und_Wert();
    peak.Wert = 0;
    foreach (var value in lfw)
    {
        if (value.Wert > peak.Wert || decay > breite / 2)
        {
            peak.Wert = value.Wert;
            peak.Frequenz = value.Frequenz;
            decay = 0;
        }
        else
            decay++;

        if (decay == breite / 2)
        {
                yield return peak;
                peak = new  Frequenz_und_Wert(){Wert = peak.Wert, Frequenz = peak.Frequenz};
        }
    }
}

排序不起作用的原因是你不断覆盖同一个实例,你需要为每个收益率返回一个新的Frequenz_und_Wert实例。