如何删除具有相同整个部分的数字并保持列表中的第一个出现?

时间:2014-02-10 15:32:53

标签: c# list duplicates double

我有以下列表:

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

1 个答案:

答案 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>