这是我的代码
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;
}
}
答案 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实例。