2009-07-20 14 views
11

Nie chcę tego używać praktycznie (z wielu powodów), ale z czystej ciekawości chciałbym wiedzieć, czy istnieje sposób na odwrócenie kolejności ciąg znaków za pomocą wyrażeń LINQ i/lub LAMBDA w w jednej linii kodu, bez korzystania z jakichkolwiek ramowych metod "odwrotnych".Czy możesz odwrócić kolejność ciągów w jednym wierszu z wyrażeniem LINQ lub LAMBDA

np.

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

i reversedValue spowoduje "em esrever"

EDIT wyraźnie niepraktyczne Problem/rozwiązanie ja to wiem, więc nie martw się to ściśle kwestia ciekawość wokół konstruktem LINQ/LAMBDA .

+0

tylko jedno pytanie: dlaczego? –

+0

Jestem zdezorientowany .... dlaczego nie chcesz użyć metody Array.Reverse? – James

+1

jak LINQ lub lambda są lepsze niż bardziej odpowiednie metody ciągów? –

Odpowiedz

23

nie widzę praktycznego wykorzystania do tego, ale tylko dla dobra zabawa:

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

@Mebraad, nie martw się, nie użyłbym go praktycznie, ale starałem się zaspokoić osobistą ciekawość. –

27

Cóż, mogę to zrobić w jednej bardzo długiej kolejce, nawet bez używania LINQ lub 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); 

(redaktorzy: Drodzy potencjalni. zrobić nie rozpakować to na wielu liniach Istotą jest to, że znajduje się w jednej linii, jak na zdaniu nad nim i pytanie.)

Jednakże, gdybym zobaczył, że ktoś unika stosowania metod ramowych ze względu na to, zastanawiałbym się nad ich zdrowiem.

Zauważ, że to wcale nie używa LINQ. LINQ odpowiedź byłaby:

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

Unikanie stosując odwrotną, ale przy użyciu OrderByDescending zamiast:

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

Blech. Podoba mi się jednak odpowiedź Mehrdada. Oczywiście wszystkie z nich są znacznie mniej wydajne niż proste podejście.

Och, i one też się mylą. Odwracanie łańcucha jest bardziej złożone niż odwrócenie kolejności punktów kodowych. Rozważyć połączenie znaków zastępczych, pary itp ...

+0

Crap. Jeden błąd popełniłem dwa razy, zanim zrobiłem to dobrze, z powodu tak łatwego problemu. Unikałbym mojego podejścia za wszelką cenę! –

+1

Nie wiem, czy to tylko ja, ale nie uważam tego za jedną linijkę, jeśli terminator instrukcji; jest używany i inne oświadczenie pojawia się bezpośrednio po nim. –

+0

@Josh: Biorąc pod uwagę, że całe pytanie jest nieco śmieszne IMO, brałem to absolutnie dosłownie. Połóż to w ten sposób - jeśli poszedłeś do numeru wiersza zawierającego każdą instrukcję w tym kodzie, ile różnych wartości otrzymasz? Pokazuje tylko wartość w byciu precyzyjnym. –

5

wariant z rekurencyjne 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

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

Nie potrzebujesz ToCharArray i wybierz – nawfal

5

Można użyć Aggregate dołączana do każdego Char odwróconym ciągiem:

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

+1, ale jest to acc + c – dudeNumber4

+0

Nie sądzę, że ... 'acc' goes' "" '->' "r" '->' "er" '-> '" ver "' -> '...' –

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

Pyta "bez użycia jakiegokolwiek schematu" Odwróć "metody". – shamp00

+0

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

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

Pytanie stwierdza "bez korzystania z jakichkolwiek ramowych metod" Reverse ". – shamp00

2

Oprócz jednego poprzedniego posta jest to bardziej wydajne rozwiązanie.

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

całkiem proste.Od tego momentu mam jedną metodę, która odwraca ciąg, który nie używa żadnych wbudowanych funkcji Reverse.

Więc w głównym sposobem, po prostu pójść,

Console.WriteLine (wsteczny ("Niektóre słowo"));

Technicznie to twoja jedna wkładka: P

1

Jeśli musimy wspierać łączenie znaków i zastępczych par:

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

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

Podano dziesięć odpowiedzi i trzeba dodać jeszcze jedną? Poza tym, coś, co zawsze odnosi się do odpowiedzi tylko do kodu, jest: podać krótkie wyjaśnienie. Wreszcie, pytanie jasno stwierdza * bez użycia jakichkolwiek ramowych metod "odwrotnych" *. –

Powiązane problemy