【问题标题】:Remove all null entries from generic list of Object从 Object 的通用列表中删除所有空条目
【发布时间】:2019-03-04 19:04:13
【问题描述】:

这应该很容易,但似乎让我望而却步。

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

var seriesData = new List<List<object>>();

如何循环遍历每条记录,并在内部的任何位置省略任何包含空值的记录?

通常,内部的每个列表都类似于以下内容之一:

["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);
}

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

【问题讨论】:

    标签: c# list object generics


    【解决方案1】:

    您可以使用接受谓词的RemoveAll

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

    【讨论】:

    • 这是最优雅的解决方案!我最喜欢它:)
    • 请注意,如果对你来说看起来更优雅,你也可以对 null 使用模式匹配 x =&gt; x is null
    • 我们有一个赢家!!太感谢了!完美运行!
    【解决方案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();
    

    【讨论】:

    • 漂亮,我现在就试试这个!
    • 不幸的是,这实际上并没有删除空条目。 (空列表)
    • @Penjimon 你没有提到列表本身可能为空
    【解决方案3】:

    没有 LinQ,您可能会执行以下操作:

    int i = 0;
    while (i < seriesData.Count)
    {
        if (seriesData[i].Contains(null))
        {
            seriesData.RemoveAt(i);
        } else {
            i++;
        }
    }
    

    这很可能是性能最高的解决方案,如果您还没有使用它,则不需要 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++;
        }
    }
    

    【讨论】:

    • 不错的想法。我什至很惊讶 OP 没有对 foreach 产生异常@
    • 这个效率很低,最坏的情况是 O(n ^ 2)。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 2012-04-07
      • 2014-05-14
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多