C# 从对象的常规列表中删除所有空项

C# 从对象的常规列表中删除所有空项,c#,list,object,generics,C#,List,Object,Generics,这本应该很容易,但我似乎一直在逃避 给定此变量:(包含约30条记录) 有时: ["02/18/2019", 5, {null}, 10] 这是我尝试过的,但它不起作用: foreach (List<object> row in seriesData) { if (row.Contains(null)) seriesData.Remove(row); } foreach(列出序列数据中的行) { if(row.Contains(null))seriesData.Remove

这本应该很容易,但我似乎一直在逃避

给定此变量:(包含约30条记录)

有时:

["02/18/2019", 5, {null}, 10]
这是我尝试过的,但它不起作用:

foreach (List<object> row in seriesData)
{
    if (row.Contains(null)) seriesData.Remove(row);
}
foreach(列出序列数据中的行)
{
if(row.Contains(null))seriesData.Remove(row);
}

我得到的结果是完全空的?

如果可以使用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();

如果可以使用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();

如果没有LinQ,您可以执行以下操作:

int i = 0;
while (i < seriesData.Count)
{
    if (seriesData[i].Contains(null))
    {
        seriesData.RemoveAt(i);
    } else {
        i++;
    }
}
inti=0;
而(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++;
    }
}
int i=0,最后;
而(i
如果没有LinQ,您可以执行以下操作:

int i = 0;
while (i < seriesData.Count)
{
    if (seriesData[i].Contains(null))
    {
        seriesData.RemoveAt(i);
    } else {
        i++;
    }
}
inti=0;
而(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++;
    }
}
int i=0,最后;
而(i
您可以使用接受谓词的
RemoveAll

seriesData.RemoveAll(row => row.Any(x => x == null))

您可以使用接受谓词的
RemoveAll

seriesData.RemoveAll(row => row.Any(x => x == null))

给猫剥皮有很多种方法。下面是另一个不会修改原始列表的列表:

var nonulls = seriesData.Where(sd => !sd.Any(o => o == null));

给猫剥皮有很多种方法。下面是另一个不会修改原始列表的列表:

var nonulls = seriesData.Where(sd => !sd.Any(o => o == null));

漂亮,我现在就试试这个!不幸的是,这实际上并没有删除空条目。(空列表)@Penjimon你没有提到列表本身可能是空的,我现在就试试这个!不幸的是,这实际上并没有删除空条目。(空列表)@Penjimon你没有提到列表本身可能是空的。我甚至感到惊讶的是,OP没有得到一个例外,
foreach
这是非常低效的,在最坏的情况下是O(n^2)。我想得很好。我甚至感到惊讶的是,OP没有得到一个例外,
foreach
这是非常低效的,在最坏的情况下是O(n^2)。这是最优雅的解决方案!我最喜欢它:)注意,如果对你来说更优雅的话,你也可以对null使用模式匹配
x=>x为null
,我们有一个赢家!!非常感谢你!很好用!这是最优雅的解决方案!我最喜欢它:)注意,如果对你来说更优雅的话,你也可以对null使用模式匹配
x=>x为null
,我们有一个赢家!!非常感谢你!很好用!