【发布时间】:2016-04-05 02:13:47
【问题描述】:
发布了一个类似的问题,但我没有代表在该线程中提出后续问题:(
那个问题和解决方案是HERE。
如果我有一个包含多次出现的项目的列表,List.Distinct() 将删除重复项,但原始项仍将保留。如果我想删除多次出现的项目,包括原始项目,那么对 ORIGINAL 列表执行此操作的最有效方法是什么?
给定一个名为 oneTime 的列表:
{ 4, 5, 7, 3, 5, 4, 2, 4 }
所需的输出将是一次性的:
{ 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;
}
打印出来的图片和出了什么问题: http://i.stack.imgur.com/pXcdK.jpg
【问题讨论】:
-
那么为什么不将结果分配给原始列表呢?