Невозможно неявно преобразовать тип 'int' в 'char' при использовании метода Aggregate Extension - PullRequest
0 голосов
/ 26 августа 2011

Попытка перевернуть строку, но с ошибкой в ​​агрегированной функции

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 ]

6 голосов
/ 26 августа 2011

Точно так же, как сказано: результат a + b равен int, но вы хотите, чтобы он был char.Чтобы получить compile , вы можете просто использовать:

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

... но я не думаю, что это сделает то, что вы хотите.

Iпредлагаю вам не использовать LINQ для этого, чтобы начать с:

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

Обратите внимание, что не работает должным образом с такими вещами, как объединение символов, суррогатные пары и т. д.1017 * Если вы действительно хотите использовать 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();
}

... но я все еще не уверен, что оно того стоит ...

2 голосов
/ 26 августа 2011

Вы должны использовать другую перегрузку Aggregate, чтобы указать строку типа возврата, используя начальное значение:

var res = reverse.Aggregate("", (a, b) => a + b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...