Can you reverse order a string in one line with LINQ or a LAMBDA expression

前端 未结 11 872
暗喜
暗喜 2021-02-02 16:01

Not that I would want to use this practically (for many reasons) but out of strict curiousity I would like to know if there is a way to reverse order a string using LINQ and/or

相关标签:
11条回答
  • 2021-02-02 16:10

    Variant with recursive lambda:

      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, Dejan

    0 讨论(0)
  • 2021-02-02 16:11
    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;
    }
    

    Quite simple. So, from this point on, I have a single method that reverses a string, that doesn't use any built-in Reverse functions.

    So in your main method, just go,

    Console.WriteLine(Reverse("Some word"));

    Technically that's your one liner :P

    0 讨论(0)
  • 2021-02-02 16:12

    Well, I can do it in one very long line, even without using LINQ or a lambda:

    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);
    

    (Dear potential editors: do not unwrap this onto multiple lines. The whole point is that it's a single line, as per the sentence above it and the question.)

    However, if I saw anyone avoiding using framework methods for the sake of it, I'd question their sanity.

    Note that this doesn't use LINQ at all. A LINQ answer would be:

    string reverseValue = new string(original.Reverse().ToArray());
    

    Avoiding using Reverse, but using OrderByDescending instead:

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

    Blech. I like Mehrdad's answer though. Of course, all of these are far less efficient than the straightforward approach.

    Oh, and they're all wrong, too. Reversing a string is more complex than reversing the order of the code points. Consider combining characters, surrogate pairs etc...

    0 讨论(0)
  • 2021-02-02 16:13

    You can use Aggregate to prepend each Char to the reversed string:

     "reverse me".Aggregate("", (acc, c) => c + acc);
    
    0 讨论(0)
  • 2021-02-02 16:19
    string str="a and b";
    string t="";
    
    char[] schar = str.Reverse().ToArray();
    
    foreach (char c in schar )
    {
        test += c.ToString();
    }
    
    0 讨论(0)
  • 2021-02-02 16:24
    var reversedValue = value.ToCharArray()
                             .Select(ch => ch.ToString())
                             .Aggregate<string>((xs, x) => x + xs);
    
    0 讨论(0)
提交回复
热议问题