使用Aggregate Extension方法时,无法将类型'int'隐式转换为'char'

时间:2011-08-26 10:05:55

标签: c# lambda

尝试反转字符串但在聚合函数中出错

private string Reverse(string strValue)
        {

            char[] chArray = strValue.ToCharArray();
            var reverse = chArray.Reverse();

            var res = reverse.Aggregate((a,b)=>a+b);

            return res.ToString();
        }

无法将类型'int'隐式转换为'char'。存在显式转换(您是否错过了演员?) 那是什么错误?

2 个答案:

答案 0 :(得分:6)

正如它所说:a + b的结果是int,但您希望它是char。要将其转换为 compile ,您只需使用:

var res = reverse.Aggregate((a,b)=>(char) (a+b));

......但我认为这不会做你想要的。

我建议您不要使用LINQ开头:

private string Reverse(string strValue)
{
    char[] chArray = strValue.ToCharArray();
    Array.Reverse(chArray);
    return new string(chArray);
}

请注意,此 无法正常使用组合字符,代理对等等。

如果您真的想使用LINQ,可以使用:

private string Reverse(string strValue)
{
    return new string(strValue.Reverse().ToArray());
}

无需致电Aggregate。如果确实想让它变慢并且使用字符串连接Aggregate(它将是O(n 2 )),你可以这样做:

private string Reverse(string strValue)
{
    return strValue.Reverse().Aggregate("", (str, c) => str + c);
}

这里我们提供了一个字符串种子值,因此参数str将是一个字符串,+将是字符串连接,而不是字符添加

您可以使用StringBuilder提高效率:

private string Reverse(string strValue)
{
    return strValue.Reverse()
                   .Aggregate(new StringBuilder(), (sb, c) => sb.Append(c))
                   .ToString();
}

......但我仍然不确定它是否值得...

答案 1 :(得分:2)

您必须使用另一个Aggregate重载来使用种子值指定返回类型字符串:

var res = reverse.Aggregate("", (a, b) => a + b);