C#LINQ Aggregate将字符串转换为int

时间:2014-08-09 15:33:22

标签: c# linq type-conversion aggregate

我在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);
    }
}

1 个答案:

答案 0 :(得分:2)

首先,总有两个不同的步骤:

  1. 调用该函数并获得结果
  2. 尝试将结果分配给变量
  3. 第一步甚至不考虑左侧变量(在您的情况下,IEnumerable<string>)。它只关注函数的声明。

    根据Aggregate函数的文档,声明是:

    public static TSource Aggregate<TSource>(this IEnumerable<TSource> source,
                                             Func<TSource, TSource, TSource> func);
    

    注意IEnumerable<TSource>所占用的部分。由于您致电enunums.AggregateTSource会被分配到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函数仅适用于列表中的元素对。因此,您的逻辑必须与当前编写的内容大不相同。