0

错误是

'string.String(char[])' 的最佳重载方法匹配有一些无效参数

我的代码:

string reverseValue = new string(
                      value.Select((c, index) => new { c, index })
                      .OrderByDescending(x => x.index).ToArray());
4

4 回答 4

4
char[] chars = value.ToCharArray();
Array.Reverse(chars);
new String(chars);

或者(有点慢)

new String(value.Reverse().ToArray());

请注意,这不会处理 UTF32 代理对,也不会组合字符。

于 2012-08-14T17:26:56.213 回答
1

您正在选择一个新对象,而不是字符。尝试这个:

string reverseValue = new string( 
                            value.Select((c, idx) => new { 
                                                       charVal = c,  
                                                       index = idx 
                                                     })
                                 .OrderByDescending(x => x.index)
                                 .Select(x => x.charVal)
                                 .ToArray());

假设这不仅仅是学术上的,我可以建议:

/// <summary>
/// Reverses a string
/// </summary>
public static string ReverseString(this string s)
{
    char[] arr = s.ToCharArray();
    Array.Reverse(arr);
    return new string(arr);
}

用法:

string reverseValue = value.ReverseString();
于 2012-08-14T17:26:04.450 回答
1

您忘记选择字符:

string reverseValue = new string(
    value.Select((c, index) => new { c, index })
    .OrderByDescending(x => x.index)
    .Select(x => x.c)
    .ToArray()
); 

另请注意,这是一种非常低效的反转字符串的方法。您可以使用Array.Reverse或者如果您真的关心性能:

public static string Reverse(string input)
{
    var length = input.Length;
    var last = length - 1;
    var chars = input.ToCharArray();
    for (int i = 0; i < length / 2; i++)
    {
        var c = chars[i];
        chars[i] = chars[last - i];
        chars[last - i] = c;
    }
    return new string(chars);
}
于 2012-08-14T17:26:36.400 回答
0

你为什么不做类似的事情:

    string r = new string( s.Reverse().ToArray() ) ;

或(因为已经采用 Reverse() )是这样的:

public static class StringHelpers
{
    public static string ToReverse( this string s )
    {
        char[] buf = new char[s.Length] ;
        int    i   = 0        ; 
        int    j   = s.Length ;
        while ( j > 0 )
        {
            buf[i++] = s[--j] ;
        }
        return new string(buf) ;           
    }

}

它不是 LINQ,但我敢打赌在这种情况下它的性能比 LINQ 更好。

于 2012-08-14T17:46:59.947 回答