Подтвердить что ты не робот

Вы можете изменить порядок строки в одной строке с помощью LINQ или выражения LAMBDA

Не то, чтобы я хотел использовать это практически (по многим причинам), но из-за строгой любопытства я хотел бы знать, есть ли способ обратить порядок строки с использованием выражений LINQ и/или LAMBDA в одной строке кода, без использования каких-либо фреймворческих методов "Обратный".

например.

string value = "reverse me";
string reversedValue = (....);

и reverseedValue приведет к "em esrever"

ИЗМЕНИТЬ Очевидно, что это непрактичная проблема/решение, которое я знаю об этом, так что не волнуйтесь, что это вопрос любопытства вокруг конструкции LINQ/LAMBDA.

4b9b3361

Ответ 1

Я не вижу практического использования для этого, но только ради удовольствия:

new string(Enumerable.Range(1, input.Length).Select(i => input[input.Length - i]).ToArray())

Ответ 2

Ну, я могу сделать это в одной очень длинной строке, даже без использования 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. Мне нравится, что Мехридд ответил. Конечно, все они намного менее эффективны, чем простой подход.

О, и они тоже ошибаются. Сторнирование строки сложнее, чем изменение порядка кодовых точек. Рассмотрим объединение символов, суррогатных пар и т.д.

Ответ 3

new string(value.Reverse().ToArray())

Ответ 4

var reversedValue = value.ToCharArray()
                         .Select(ch => ch.ToString())
                         .Aggregate<string>((xs, x) => x + xs);

Ответ 5

Вариант с рекурсивной лямбдой:

  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, Деяна

Ответ 6

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

 "reverse me".Aggregate("", (acc, c) => c + acc);

Ответ 7

var reversedValue= "reverse me".Reverse().ToArray();

Ответ 8

В дополнение к одному предыдущему сообщению здесь представлено более эффективное решение.

var actual0 = "reverse me".Aggregate(new StringBuilder(), (x, y) => x.Insert(0, y)).ToString();

Ответ 9

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

Ответ 10

Если нам нужно поддерживать объединение символов и суррогатных пар:

// 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 Класс

Ответ 11

string str="a and b";
string t="";

char[] schar = str.Reverse().ToArray();

foreach (char c in schar )
{
    test += c.ToString();
}