2009-07-20 10 views
11

Non che io voglia utilizzarlo praticamente (per molte ragioni) ma per pura curiosità vorrei sapere se esiste un modo per invertire l'ordine una stringa che utilizza espressioni LINQ e/o LAMBDA in una riga di codice, senza utilizzare alcun metodo "Reverse" di framework.È possibile invertire l'ordine di una stringa in una riga con LINQ o un'espressione LAMBDA

ad es.

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

e reversedValue si tradurrà in "em enoisrevnI"

EDIT Chiaramente un problema/soluzione impraticabile So che questo, quindi non preoccupatevi è strettamente una domanda curiosità intorno al costrutto LINQ/LAMBDA .

+0

una sola domanda: perché? –

+0

Im confuso .... perché non vuoi usare il metodo Array.Reverse? – James

+1

qual è un LINQ o una lambda meglio dei metodi di stringa più che adeguati? –

risposta

23

non vedo un uso pratico per questo, ma solo per il gusto di divertimento:

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

@ Mehrdad, non preoccuparti, non lo userei praticamente ma stavo cercando di soddisfare la curiosità personale. –

27

Beh, posso farlo in una linea molto lunga, anche senza usare LINQ o un 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); 

(Cari potenziali editori:. fare non unwrap presente su più righe il punto è che si tratta di una singola linea, come per la frase di cui sopra e la domanda.)

Tuttavia, se vedessi qualcuno che evita di usare i metodi framework per il gusto di farlo, metterei in discussione la loro sanità mentale.

Si noti che questo non utilizza affatto LINQ. Una risposta LINQ sarebbe:

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

Evitando utilizzando Reverse, ma utilizzando invece OrderByDescending:

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

Blech. Mi piace la risposta di Mehrdad però. Naturalmente, tutti questi sono molto meno efficienti rispetto all'approccio diretto.

Oh, e anche loro hanno torto. L'inversione di una stringa è più complessa rispetto all'inversione dell'ordine dei punti di codice. Prendere in considerazione i caratteri che conciliano, coppie di surrogati, ecc ...

+0

Merda. Ho avuto un errore due volte prima di averlo fatto bene, per un problema così facile. Eviterei il mio approccio a tutti i costi! –

+1

Non so se sono solo io, ma non lo considero un solo liner se un terminatore di istruzioni; viene utilizzato e un'altra affermazione appare subito dopo. –

+0

@Josh: Dato che l'intera domanda è un po 'ridicola IMO, la stavo prendendo alla lettera. Mettilo in questo modo - se andassi al numero di riga contenente ogni affermazione in quel codice, quanti valori diversi avresti ottenuto? Mostra solo il valore nell'essere precisi. –

5

variante con lambda ricorsiva:

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

Non hai bisogno del ToCharArray e seleziona – nawfal

5

È possibile utilizzare Aggregate inserire all'inizio di ciascuna Char alla stringa invertita:

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

+1, ma è acc + c – dudeNumber4

+0

Non pensare così ... 'acc' goes' "" '->' "r" '->' "er" '-> '" ver "' -> '...' –

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

Gli stati delle domande 'senza utilizzare alcun metodo' Reverse 'metodi'. – shamp00

+0

Oppure 'string.Concat (valore.Reverse())' – nawfal

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

Stati di domande 'senza utilizzare alcun metodo "Metodi inversi". – shamp00

2

In aggiunta a un post precedente, ecco una soluzione più 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; 
} 

abbastanza semplice.Quindi, da questo punto in poi, ho un unico metodo che inverte una stringa, che non usa alcuna funzione Reverse incorporata.

Quindi nel tuo metodo principale, basta andare,

Console.WriteLine (Reverse ("Qualche parola"));

Tecnicamente questo è il vostro uno di linea: P

1

Se abbiamo bisogno per supportare i caratteri che conciliano e coppie di surrogati:

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

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

Dieci risposte fornite ed è necessario aggiungerne un'altra? A parte questo, qualcosa che si applica sempre alle risposte solo in codice è: dare una breve spiegazione. Infine, la domanda afferma chiaramente * senza utilizzare alcun metodo "Reverse" di framework *. –

Problemi correlati