gpt4 book ai didi

c# - 如何通过保留 IGrouping 来过滤 IGrouping 的 IEnumerable 的元素

转载 作者:行者123 更新时间:2023-12-02 03:30:24 32 4
gpt4 key购买 nike

我有一个序列 IGrouping

IEnumerable<IGrouping<Key, Element>> sequence = ...;

和谓词

Func<Element, bool> predicate = ...;

如何过滤Element s 通过将结果保持为 IEnumerable<IGrouping<Key, Element>>无需展平序列并完全重新创建分组?

我可以做类似的事情

IEnumerable<IGrouping<Key, Element>> filtered =
from grouping in sequence
from element in grouping
where predicate(element)
select new { grouping.Key, element } into keyElem
group keyElem.element by keyElem.Key into g
select g;

但是,根据序列的大小和涉及的类型,这将需要一些时间和/或内存。

我想“简单地”过滤 IGrouping 内的元素s。我会接受结果中的空分组。

(我认为这个问题可以通过回答如何过滤 IEnumerable<IEnumerable<Element>> 的元素同时保持结果 IEnumerable<IEnumerable<Element>> 的问题来回答。)

最佳答案

您无法修改现有的 IGrouping ,但您可以轻松创建自己的实现和辅助方法:

public static class Groupings
{
public static IGrouping<TKey, TElement>
FilterElements<TKey, TElement>(
this IGrouping<TKey, TElement> grouping,
Func<TElement, bool> predicate) =>
new LateGrouping<TKey, TElement>(grouping.Key, grouping.Where(predicate));
}

internal class LateGrouping<TKey, TElement> : IGrouping<TKey, TElement>
{
public TKey Key { get; }
private readonly IEnumerable<TElement> elements;

public LateGrouping(TKey key, IEnumerable<TElement> elements)
{
Key = key;
this.elements = elements;
}

public IEnumerator<TElement> GetEnumerator() => elements.GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

然后你就可以拿你的IEnumerable<IGrouping<...>>并使用正常的选择,在内部进行过滤:

groupings = groupings.Select(g => g.FilterElements(predicate));

关于c# - 如何通过保留 IGrouping 来过滤 IGrouping 的 IEnumerable 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52000844/

32 4 0