这应该很容易,但似乎使我难以理解。
给出此变量:(包含约30条记录)
var seriesData = new List<List<object>>();
如何遍历每条记录,并在内部任何地方省略任何包含null的记录?
通常,其中的每个列表看起来都将是以下之一:
["02/16/2019", 5, 7, 10]
["02/17/2019", 3, 15, 2]
有时:
["02/18/2019", 5, {null}, 10]
这是我尝试过的方法,但是不起作用:
foreach (List<object> row in seriesData)
{
if (row.Contains(null)) seriesData.Remove(row);
}
我最终得到的结果是完全空的?
答案 0 :(得分:5)
您可以使用RemoveAll
接受谓词:
seriesData.RemoveAll(row => row.Any(x => x == null))
答案 1 :(得分:2)
如果可以使用LINQ,这应该很容易:
seriesData = seriesData
// filter the lists (x) where all items in them (y) are not null
.Where(x => x.All(y => y != null))
// and get the result
.ToList();
答案 2 :(得分:2)
没有LinQ,您可以执行以下操作:
int i = 0;
while (i < seriesData.Count)
{
if (seriesData[i].Contains(null))
{
seriesData.RemoveAt(i);
} else {
i++;
}
}
这可能是性能最高的解决方案,如果您还没有使用LinQ,则不需要LinQ。另一方面,如果您已经使用过LinQ,那么样式可能比性能更重要。
作为练习,我编写了一个版本,该版本可以更改条目的顺序,但复杂度较低。如@Lee所述,以上代码可能具有O(n ^ 2)复杂度。这是另一个版本,如果性能真的很重要,也许进行一些基准测试会有所帮助:
int i = 0, last;
while (i < seriesData.Count)
{
if (seriesData[i].Contains(null))
{
last = seriesData.Count - 1;
seriesData[i] = seriesData[last];
seriesData.RemoveAt(last);
} else {
i++;
}
}
答案 3 :(得分:0)
有很多方法可以给猫皮。这又是一个不会修改原始列表的文件:
var nonulls = seriesData.Where(sd => !sd.Any(o => o == null));