2009-07-20 9 views
11

Non que je voudrais l'utiliser pratiquement (pour plusieurs raisons) mais par curiosité stricte je voudrais savoir s'il y a un moyen de renverser l'ordre une chaîne utilisant des expressions LINQ et/ou LAMBDA dans une ligne de code, sans utiliser de méthodes «Reverse» de structure.Pouvez-vous inverser l'ordre d'une chaîne dans une ligne avec LINQ ou une expression LAMBDA

par exemple.

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

et reversedValue se traduira par "em esrever"

EDIT De toute évidence un problème peu pratique/solution que je sais, donc ne vous inquiétez pas il est strictement une question de curiosité autour de la construction LINQ/LAMBDA .

+0

juste une question: Pourquoi? –

+0

Im confused .... pourquoi ne voulez-vous pas utiliser la méthode Array.Reverse? – James

+1

comment un LINQ ou un lambda est-il meilleur que les méthodes de cordes plus qu'adéquates? –

Répondre

23

Je ne vois pas une pratique pour cela, mais juste pour le plaisir de plaisir:

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

@Mehrdad, ne vous inquiétez pas, je ne l'utiliserais pas pratiquement mais j'essayais de satisfaire ma curiosité personnelle. –

27

Eh bien, je peux le faire en une ligne très longue, même sans utiliser LINQ ou 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); 

(Chers éditeurs potentiels:. pas faire Déballer ce sur plusieurs lignes le tout est que c'est une seule ligne, selon la phrase ci-dessus et la question.)

Cependant, si je voyais quelqu'un éviter d'utiliser des méthodes de cadre pour le plaisir de le faire, je remettrais en question leur santé mentale.

Notez que cela n'utilise pas LINQ du tout. Une réponse LINQ serait:

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

Éviter l'utilisation inverse, mais en utilisant à la place OrderByDescending:

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

Blech. J'aime bien la réponse de Mehrdad. Bien sûr, tout cela est beaucoup moins efficace que l'approche simple.

Oh, et ils ont tous tort aussi. L'inversion d'une chaîne est plus complexe que l'inversion de l'ordre des points de code. Pensez à combiner des caractères, des paires de substitution etc ...

+0

Merde. J'ai fait une erreur deux fois avant que je l'ai fait correctement, pour un problème si facile. J'éviterais mon approche à tout prix! –

+1

Je ne sais pas si c'est juste moi, mais je ne considère pas comme un doublure si un terminateur de déclaration; est utilisé et une autre déclaration apparaît directement après. –

+0

@Josh: Étant donné que toute la question est un peu ridicule OMI, je le prenais absolument littéralement. En d'autres termes, si vous alliez au numéro de ligne contenant chaque instruction dans ce code, combien de valeurs différentes obtiendriez-vous? Cela montre simplement la valeur d'être précis. –

5

variante avec lambda récursive:

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

Vous n'avez pas besoin de ToCharArray et sélectionnez – nawfal

5

Vous pouvez utiliser Aggregate préfixer chaque Char à la chaîne inversée:

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

+1, mais c'est acc + c – dudeNumber4

+0

Ne le pensez pas ... 'acc' va' '" '->' "r" '->' "er" '-> '" ver "' -> '...' –

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

Les états de question 'sans employer n'importe quel cadre "Reverse" des méthodes'. – shamp00

+0

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

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

Questionne les états 'sans utiliser de cadre' Reverse 'méthodes'. – shamp00

2

En plus d'un post précédent, voici une solution plus performante.

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

assez simple.Donc, à partir de ce moment, j'ai une seule méthode qui inverse une chaîne, qui n'utilise aucune fonction Inversée intégrée.

Donc, dans votre principale méthode, allez juste,

Console.WriteLine (Marche arrière ("un mot"));

Techniquement c'est votre une doublure: P

1

Si nous devons soutenir combinant des personnages et des paires de substitution:

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

Documentation: 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

Dix réponses données et vous devez en ajouter une autre? En dehors de cela, quelque chose qui s'applique toujours aux réponses de type code seulement: donnez une brève explication. Enfin, la question énonce clairement * sans utiliser de cadre "Reverse" des méthodes *. –

Questions connexes