gpt4 book ai didi

c# - 是否可以实现递归 "SelectMany"?

转载 作者:可可西里 更新时间:2023-11-01 08:37:46 28 4
gpt4 key购买 nike

众所周知,Enumerable.SelectMany将一系列序列展平为单个序列。如果我们想要一种可以压平序列序列序列的序列的方法,等等递归怎么办?

我很快想出了一个使用 ICollection<T> 的实现,即急切地评估,但我仍在摸索如何制作一个懒惰评估的,比如说,使用 yield关键字。

static List<T> Flatten<T>(IEnumerable list)  {
var rv = new List<T>();
InnerFlatten(list, rv);
return rv;
}

static void InnerFlatten<T>(IEnumerable list, ICollection<T> acc) {
foreach (var elem in list) {
var collection = elem as IEnumerable;
if (collection != null) {
InnerFlatten(collection, acc);
}
else {
acc.Add((T)elem);
}
}
}

有什么想法吗?欢迎使用任何 .NET 语言的示例。

最佳答案

据我了解你的想法,这是我的变体:

static IEnumerable<T> Flatten<T>(IEnumerable collection)
{
foreach (var o in collection)
{
if (o is IEnumerable && !(o is T))
{
foreach (T t in Flatten<T>((IEnumerable)o))
yield return t;
}
else
yield return (T)o;
}
}

检查一下

List<object> s = new List<object>
{
"1",
new string[] {"2","3"},
"4",
new object[] {new string[] {"5","6"},new string[] {"7","8"},},
};
var fs = Flatten<string>(s);
foreach (string str in fs)
Console.WriteLine(str);
Console.ReadLine();

显然,它确实缺少一些类型有效性检查(如果集合不包含 T,则为 InvalidCastExcpetion,并且可能还有一些其他缺点)......好吧,至少它是惰性的- 根据需要进行评估。

添加了

!(o is T) 以防止将string 扁平化为char 数组

关于c# - 是否可以实现递归 "SelectMany"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409194/

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