エラーは
'string.String(char [])'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります
私のコード:
string reverseValue = new string(
value.Select((c, index) => new { c, index })
.OrderByDescending(x => x.index).ToArray());
char[] chars = value.ToCharArray();
Array.Reverse(chars);
new String(chars);
または(やや遅い)
new String(value.Reverse().ToArray());
これはUTF32サロゲートペアを処理せず、文字の結合も処理しないことに注意してください。
charsではなく新しいオブジェクトを選択しています。これを試して:
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();
文字を選択するのを忘れました:
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);
}
なぜあなたはただ次のようなことをしないのですか?
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よりもパフォーマンスが優れていると思います。