gpt4 book ai didi

c# - 展平 IEnumerable>;理解泛型

转载 作者:IT王子 更新时间:2023-10-29 04:04:12 26 4
gpt4 key购买 nike

我写了这个扩展方法(编译):

public static IEnumerable<J> Flatten<T, J>(this IEnumerable<T> @this) 
where T : IEnumerable<J>
{
foreach (T t in @this)
foreach (J j in t)
yield return j;
}

下面的代码导致编译时错误(没有找到合适的方法),为什么?:

IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();

如果我像下面这样实现扩展,我不会得到编译时错误:

public static IEnumerable<J> Flatten<J>(this IEnumerable<IEnumerable<J>> @this)
{
foreach (IEnumerable<J> js in @this)
foreach (J j in js)
yield return j;
}

Edit(2):我认为这个问题已经回答,但它提出了另一个关于重载解析和类型约束的问题。我把这个问题放在这里:Why aren't type constraints part of the method signature?

最佳答案

首先,你不需要Flatten() ;该方法已经存在,称为 SelectMany() .你可以像这样使用它:

IEnumerable<IEnumerable<int>> foo = new [] { new[] {1, 2}, new[] {3, 4} };
var bar = foo.SelectMany(x => x); // bar is {1, 2, 3, 4}

其次,您的第一次尝试没有成功,因为泛型类型推断仅基于方法的参数起作用,而不是与方法关联的泛型约束。由于没有直接使用 J 的参数泛型参数,类型推理引擎猜不出是什么J应该是,因此不认为您的方法是候选方法。

看看如何SelectMany() 很有启发性解决这个问题:它需要额外的 Func<TSource, TResult>争论。这允许类型推理引擎确定两种泛型类型,因为它们都仅基于提供给方法的参数可用。

关于c# - 展平 IEnumerable<IEnumerable<>>;理解泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440497/

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