我有一个固定大小为10的字符串数组。 某些元素可能是null
。 我想使用LINQ从数组中移除值为null
的元素,但只能移除末尾的元素。
输入:
"Hello", null, "World", null, null, null, null, null, null, null
输出:
"Hello", null, "World"
因此输出数组包含除包含null
的尾随元素之外的所有元素。
我想到了反转IEnumerable,然后执行SkipWhile并再次反转它。 这是可能的,在我的情况下不会对性能造成太大的影响,但我很好奇是否有更优雅的解决方案。
如果您的集合是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
逻辑。