我有以下列表:
data = [293.0, 293.1, 293.5, 390.0, 390.2, 390.4, 391.4]
我想删除具有相同整个部分的值并将它们存储到辅助列表中,并将第一个值存储到主列表中。
结果:
main = [293.0, 390.0, 391.4]
secondary = [293.1, 293.5, 390.2, 391.4]
这是我的计划:
public static void checkForOverlap(List<double> data)
{
List<double> main = new List<double>();
List<double> secondary = new List<double>();
//pointer holds the first occured value
double pointer;
bool firstOccurence = true;
pointer = Convert.ToInt32(data[0]);
for (int i = 0; i < data.Count; i++ )
{
if ((data[i] - pointer) < 1 && (data[i] - pointer) == 0 && firstOccurence == true)
{
main.Add(data[i]);
firstOccurence = false;
}
if (data[i] > 1)
{
pointer = Convert.ToInt32(data[i]);
firstOccurence = true;
}
else {
secondary.Add(data[i]);
}
}
}
答案 0 :(得分:4)
使用LINQ很容易。首先,按整数部分对输入数据进行分组:
var groups = data.GroupBy(f => (int)f);
然后您可以简单地从组中投射到主要和次要序列中:
var main = groups.Select(g => g.First()).ToList();
var secondary = groups.SelectMany(g => g.Skip(1)).ToList();
这保证完全按照您的描述工作,因为GroupBy
提供了必要的保证(当您按照输入中数据的相同顺序进行枚举时,组本身和每个组内的项都会出现。)< / p>