【问题标题】:Cannot implicitly convert type 'int' to 'char' while using Aggregate Extension method使用聚合扩展方法时无法将类型“int”隐式转换为“char”
【发布时间】:2011-08-26 10:05:55
【问题描述】:

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

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”。存在显式转换(您是否缺少演员表?) 那么到底是什么错误呢?

【问题讨论】:

  • 你为什么要这样聚合它?我不明白。

标签: c# lambda


【解决方案1】:

正如它所说:a + b 的结果是 int,但您希望它是 char。要让它编译,你可以使用:

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(n2)),您可以这样做:

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();
}

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

【讨论】:

  • 那么我们不能在这里使用聚合来合并字符串
  • 我喜欢你的 StringBuilder 和 Aggregate 方法。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多