gpt4 book ai didi

c# - 取出除最后一个满足条件的所有项目?

转载 作者:太空狗 更新时间:2023-10-30 00:48:49 25 4
gpt4 key购买 nike

我的具体要求是我有一个 IEnumerable<IEnumerable<string>> ,我想“获取”外部枚举中的所有项目,但任何“空”尾随项目除外,其中“空”表示所有字符串均为空/空或内部枚举为空。请注意,我想保留在最后一个非空项之前出现的所有空项。例如:

Item 1: a, b, c
Item 2: (nothing)
Item 3: a, f, g, h
Item 4: (nothing)
Item 5: (nothing)

我想保留第 1-3 项但修剪第 4 项和第 5 项。

在更一般的意义上,我有一个项目枚举,我想在其中剪掉任何满足条件的尾随项目,这些项目出现在最后一个不满足条件的项目之后。

为了选择合适的解决方案,我可能会补充一点,外部枚举通常包含几百到几十万个项目,而内部枚举每个只包含几个项目。我可能只需要修剪几个空项目。

我当前的解决方案是将所有外部项目放入一个列表中(在使用 .Select(...) 转换它们之后),然后在循环中不断删除最后一个项目(如果它为空),直到找到一个非空项目。

最佳答案

没有标准高效的 LINQ 解决方案。我会使用这样的自定义扩展“LINQ like”方法:

public static class EnumerableExtensions
{
public static IEnumerable<T> SkipLastWhile<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
var skipBuffer = new List<T>();
foreach (var item in source)
{
if (predicate(item))
skipBuffer.Add(item);
else
{
if (skipBuffer.Count > 0)
{
foreach (var skipped in skipBuffer)
yield return skipped;
skipBuffer.Clear();
}
yield return item;
}
}
}
}

它需要额外的空间来缓冲满足跳过谓词的最长项目序列,而 LINQ Reverse 方法必须缓冲整个输入序列。

用法将是:

var result = input.SkipLastWhile(e => !e.Any());

关于c# - 取出除最后一个满足条件的所有项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43123719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com