删除出现多于一次的列表元素

pel*_*elt 1 c# linq list

有一个类似的问题发布,但我没有代表在那个线程中问一个后续问题:(

这个问题和解决方案在这里

如果我有一个列表,其中包含List.Distinct()重复出现的项目,则将删除重复项,但原始列表仍将保留。如果我想删除重复出现的项目(包括原始项目),最有效的方法是对原始列表进行处理?

给定一个名为oneTime的列表: { 4, 5, 7, 3, 5, 4, 2, 4 }

所需的输出将在oneTime中: { 7, 3, 2 }

谢谢你的帮助!

----编辑和跟进问题@ enigmativity,2016年4月8日-----------------

这是我的脚本正在执行的伪版本。它是在.NET3.5上运行的NinjaTrader中完成的。

我将附上代码应该做的一般性想法,并附上实际脚本,但是除非使用NinjaTrader,否则它可能没有用。

但实际上,这是一个很大的z循环。每次将一系列数字添加到“ LiTics”。我不想打扰。然后,我将该列表传递给函数,并返回仅出现一次的值的列表。然后,我想每次循环查看这些数字。

它最初可以运行,但是要在各种数据集上运行,经过几次循环后,它会开始报告出现多次的值。我不确定为什么要这么做?

for(int z=1; z<=10000; z +=1)//Runs many times 
{ 
    if (BarsInProgress ==0 &&CurrentBar-oBarTF1>0 &&startScript )   //Some Condition
    {
        for(double k=Low[0]; k<=High[0]; k +=TickSize)  
        {   
            LiTics.Add(k);  
            //Adds a series of numbers to this list each time through z loop
            //This is original that I do not want to disturb
        }

        LiTZ.Clear();  //Display list to show me results Clear before populating
        LiTZ=GetTZone(LiTics); //function created in thread(below)
                               //Passing the undisturbed list that is modified on every loop
        foreach (double prime in LiTZ) { Print(Times[0] +",  " +prime);  }
        //Printing to see results   
    }

}//End of bigger 'z' loop

//Function created to get values that appear ONLY once
public List<double> GetTZone(List<double> sequence) 
{  
    var result =
        sequence
            .GroupBy(x => x)
            .Where(x => !x.Skip(1).Any())
            .Select(x => x.Key)
            .ToList();
    return result;

}
Run Code Online (Sandbox Code Playgroud)

打印出的图片以及出了什么问题:http : //i.stack.imgur.com/pXcdK.jpg

Eni*_*ity 5

因此,如果您可以拥有一个新列表,那么这是最简单的方法:

var source = new List<int>() { 4, 5, 7, 3, 5, 4, 2, 4 };

var result =
    source
        .GroupBy(x => x)
        .Where(x => !x.Skip(1).Any())
        .Select(x => x.Key)
        .ToList();
Run Code Online (Sandbox Code Playgroud)

这给出:

{7,3,2}

如果要从原始源中删除值,请执行以下操作:

var duplicates =
    new HashSet<int>(
        source
            .GroupBy(x => x)
            .Where(x => x.Skip(1).Any())
            .Select(x => x.Key));

source.RemoveAll(n => duplicates.Contains(n));
Run Code Online (Sandbox Code Playgroud)