Ответ 1
Я не вижу практического использования для этого, но только ради удовольствия:
new string(Enumerable.Range(1, input.Length).Select(i => input[input.Length - i]).ToArray())
Не то, чтобы я хотел использовать это практически (по многим причинам), но из-за строгой любопытства я хотел бы знать, есть ли способ обратить порядок строки с использованием выражений LINQ и/или LAMBDA в одной строке кода, без использования каких-либо фреймворческих методов "Обратный".
например.
string value = "reverse me";
string reversedValue = (....);
и reverseedValue приведет к "em esrever"
ИЗМЕНИТЬ Очевидно, что это непрактичная проблема/решение, которое я знаю об этом, так что не волнуйтесь, что это вопрос любопытства вокруг конструкции LINQ/LAMBDA.
Я не вижу практического использования для этого, но только ради удовольствия:
new string(Enumerable.Range(1, input.Length).Select(i => input[input.Length - i]).ToArray())
Ну, я могу сделать это в одной очень длинной строке, даже без использования LINQ или лямбда:
string original = "reverse me"; char[] chars = original.ToCharArray(); char[] reversed = new char[chars.Length]; for (int i=0; i < chars.Length; i++) reversed[chars.Length-i-1] = chars[i]; string reversedValue = new string(reversed);
(Уважаемые потенциальные редакторы: не разворачивайте это на несколько строк. Все дело в том, что это одна строка в соответствии с предложением над ним и вопросом.)
Однако, если бы я увидел, что кто-то избегает использования рамочных методов ради него, я бы поставил под сомнение их здравомыслие.
Обратите внимание, что это вообще не использует LINQ. Ответ LINQ будет следующим:
string reverseValue = new string(original.Reverse().ToArray());
Избегайте использования Реверса, но вместо этого используйте OrderByDescending:
string reverseValue = new string(original.Select((c, index) => new { c, index })
.OrderByDescending(x => x.index)
.Select(x => x.c)
.ToArray());
Blech. Мне нравится, что Мехридд ответил. Конечно, все они намного менее эффективны, чем простой подход.
О, и они тоже ошибаются. Сторнирование строки сложнее, чем изменение порядка кодовых точек. Рассмотрим объединение символов, суррогатных пар и т.д.
new string(value.Reverse().ToArray())
var reversedValue = value.ToCharArray()
.Select(ch => ch.ToString())
.Aggregate<string>((xs, x) => x + xs);
Вариант с рекурсивной лямбдой:
var value = "reverse me";
Func<String, String> f = null; f = s => s.Length == 1 ? s : f(s.Substring(1)) + s[0];
var reverseValue = f(value);
LP, Деяна
Вы можете использовать Aggregate
для добавления каждого символа Char
в обратную строку:
"reverse me".Aggregate("", (acc, c) => c + acc);
var reversedValue= "reverse me".Reverse().ToArray();
В дополнение к одному предыдущему сообщению здесь представлено более эффективное решение.
var actual0 = "reverse me".Aggregate(new StringBuilder(), (x, y) => x.Insert(0, y)).ToString();
public static string Reverse(string word)
{
int index = word.Length - 1;
string reversal = "";
//for each char in word
for (int i = index; index >= 0; index--)
{
reversal = reversal + (word.Substring(index, 1));
Console.WriteLine(reversal);
}
return reversal;
}
Довольно просто. Итак, с этого момента у меня есть единственный метод, который меняет строку, которая не использует никаких встроенных обратных функций.
Итак, в вашем основном методе просто перейдите,
Console.WriteLine(Обратное ( "Некоторое слово" ));
Технически, что ваш один вкладыш: P
Если нам нужно поддерживать объединение символов и суррогатных пар:
// This method tries to handle:
// (1) Combining characters
// These are two or more Unicode characters that are combined into one glyph.
// For example, try reversing "Not nai\u0308ve.". The diaresis (¨) should stay over the i, not move to the v.
// (2) Surrogate pairs
// These are Unicode characters whose code points exceed U+FFFF (so are not in "plane 0").
// To be represented with 16-bit 'char' values (which are really UTF-16 code units), one character needs *two* char values, a so-called surrogate pair.
// For example, try "The sphere \U0001D54A and the torus \U0001D54B.". The 𝕊 and the 𝕋 should be preserved, not corrupted.
var value = "reverse me"; // or "Not nai\u0308ve.", or "The sphere \U0001D54A and the torus \U0001D54B.".
var list = new List<string>(value.Length);
var enumerator = StringInfo.GetTextElementEnumerator(value);
while (enumerator.MoveNext())
{
list.Add(enumerator.GetTextElement());
}
list.Reverse();
var result = string.Concat(list);
Документация: MSDN: System.Globalization.StringInfo
Класс
string str="a and b";
string t="";
char[] schar = str.Reverse().ToArray();
foreach (char c in schar )
{
test += c.ToString();
}