我在CodeHunt.com上玩一个级别,我只是无法理解为什么在下面的代码中VisualStudio / Codehunt编译器希望Aggregate函数在分配的类型被假定时从字符串转换回int是IEnumerable<字符串>
using System;
using System.Linq;
class Program {
static void Main(string[] args) {
Console.WriteLine(Puzzle(4)); //supposed to return "0____ 01___ 012__ 0123_ 01234 "
Console.ReadLine();
}
public static string Puzzle(int n) {
IEnumerable<int> enunums = Enumerable.Range(0, n);
IEnumerable<string> enustrings = enunums.Aggregate((a, b) => a.ToString() + b.ToString() + new string('_', n - b) + " ");
return string.Join("", enustrings);
}
}
答案 0 :(得分:2)
首先,总有两个不同的步骤:
第一步甚至不考虑左侧变量(在您的情况下,IEnumerable<string>
)。它只关注函数的声明。
根据Aggregate
函数的文档,声明是:
public static TSource Aggregate<TSource>(this IEnumerable<TSource> source,
Func<TSource, TSource, TSource> func);
注意IEnumerable<TSource>
所占用的部分。由于您致电enunums.Aggregate
,TSource
会被分配到int
。由于此TSource在任何地方都使用,包括第二个函数参数和返回类型,因此它自然地期望int
在任何地方,即最终形式返回一个简单的int
。
public static int Aggregate<int>(this IEnumerable<int> source,
Func<int, int, int> func);
你可以调用Aggregate
的另一个重载,它接受另一种类型的种子输入,然后附加到它:
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func);
将转换为:
public static string Aggregate<int, string>(this IEnumerable<int> source,
string seed,
Func<string, int, string> func);
这应该返回最终结果string
,而不是字符串列表。
但是,任何Aggregate
函数仅适用于列表中的元素对。因此,您的逻辑必须与当前编写的内容大不相同。