提问者:小点点

LINQ如何在集合结束时移除空元素


我有一个固定大小为10的字符串数组。 某些元素可能是null。 我想使用LINQ从数组中移除值为null的元素,但只能移除末尾的元素。

输入:

"Hello", null, "World", null, null, null, null, null, null, null

输出:

"Hello", null, "World"

因此输出数组包含除包含null的尾随元素之外的所有元素。

我想到了反转IEnumerable,然后执行SkipWhile并再次反转它。 这是可能的,在我的情况下不会对性能造成太大的影响,但我很好奇是否有更优雅的解决方案。


共1个答案

匿名用户

如果您的集合是List,则可以使用FindLastIndex:

var x = new List<string> { "Hello", null, "World", null, null, null, null, null, null, null};
x = x.Take(x.FindLastIndex(s => s != null) + 1).ToList();

如果您正在使用另一个集合类型,您可以尝试如下所示:

x.Take(x.Select((s, index) => (s, index))
    .Aggregate(-1, (acc, curr) => curr.s != null ? curr.index : acc) + 1)

所以它绝对不是一个优雅的。

如果您的集合保证至少有一个not null元素,您可以让它更漂亮一点:

x.Take(x.Select((s, index) => (s, index)).Last(t => t.s != null).index + 1)

或者只是通过编写自己的扩展方法来隐藏丑陋,该扩展方法将为IEnumerable实现FindLastIndex逻辑。