2009-07-20 43 views
11

No es que me gustaría usar esto prácticamente (por muchas razones) pero por curiosidad me gustaría saber si hay una forma de invertir el orden una cadena que utiliza expresiones LINQ y/o LAMBDA en una línea del código, sin utilizar ningún método de "Inversión" de infraestructura.¿Se puede invertir una cadena en una línea con LINQ o una expresión LAMBDA

p. Ej.

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

y reversedValue dará lugar a "esrever em"

EDITAR claramente un problema/solución poco práctica Sé que esto, por lo que no se preocupe que es estrictamente una cuestión curiosidad en torno a la construcción de LINQ/LAMBDA .

+0

sólo una pregunta: ¿Por qué? –

+0

Estoy confundido ... ¿por qué no quieres usar el método Array.Reverse? – James

+1

¿cómo es un LINQ o lambda mejor que los métodos de cuerda más que adecuados? –

Respuesta

23

no veo un uso práctico para esto, pero sólo por el hecho de diversión:

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

@Mehrdad, no se preocupe, no lo usaría prácticamente, pero estaba tratando de satisfacer la curiosidad personal. –

27

Bueno, puede hacerlo en una línea muy larga, incluso sin utilizar LINQ o una 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); 

(Estimados editores: potenciales. hacer no desenvuelva esta en varias líneas el punto es que se trata de una sola línea, de acuerdo con la frase anterior y la pregunta.)

Sin embargo, si veo a alguien evitando usar métodos de framework por el bien de hacerlo, cuestionaría su cordura.

Tenga en cuenta que esto no utiliza LINQ en absoluto. Una respuesta LINQ sería:

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

Evitar el uso de reversa, pero utilizando en su lugar OrderByDescending:

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

Blech. Sin embargo, me gusta la respuesta de Mehrdad. Por supuesto, todos estos son mucho menos eficientes que el enfoque directo.

Ah, y todos están mal, también. Invertir una cadena es más complejo que invertir el orden de los puntos de código. Considere caracteres de combinación, pares suplentes, etc ...

+0

mierda. Tuve un error dos veces antes de hacerlo bien, por un problema tan fácil. ¡Evitaría mi enfoque a toda costa! –

+1

No sé si solo soy yo, pero no lo considero un trazador si es un terminador de declaración; se usa y aparece otra declaración inmediatamente después. –

+0

@Josh: Dado que toda la pregunta es algo ridículamente IMO, lo estaba tomando literalmente. Ponlo de esta manera: si fueras al número de línea que contiene cada enunciado en ese código, ¿cuántos valores diferentes obtendrías? Simplemente muestra el valor de ser preciso. –

5

variante con lambda recursiva:

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

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

No necesita ToCharArray y seleccione – nawfal

5

Puede utilizar Aggregate estar precedidos cada uno Char a la cadena invertido:

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

+1, pero es acc + c – dudeNumber4

+0

No lo crea ... 'acc' goes' "" '->' "r" '->' "er" '-> '" ver "' -> '...' –

17
new string(value.Reverse().ToArray()) 
+0

La pregunta indica "sin utilizar ningún método" Reverse "de la infraestructura. – shamp00

+0

O 'string.Concat (value.Reverse())' – nawfal

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

Pregunta 'sin utilizar ningún método de "Reverse" de framework. – shamp00

2

Además de una publicación anterior, aquí hay una solución más eficaz.

var actual0 = "reverse me".Aggregate(new StringBuilder(), (x, y) => x.Insert(0, y)).ToString(); 
1
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; 
} 

bastante simple.Entonces, a partir de este momento, tengo un único método que invierte una cadena, que no utiliza ninguna función de inversión incorporada.

Así que en su método principal, sólo tiene que ir,

Console.WriteLine (Reversa ("Algunos palabra"));

Técnicamente eso es su chiste: P

1

Si tenemos que apoyar la combinación de caracteres y los pares suplentes:

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

Documentación: MSDN: System.Globalization.StringInfo Class

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

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

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

Diez respuestas dadas y necesitas agregar otra? Aparte de eso, algo que siempre se aplica a las respuestas de solo códigos es: dar una breve explicación. Finalmente, la pregunta establece claramente * sin utilizar ningún método de "reversa" del marco *. –

Cuestiones relacionadas