2009-07-20 32 views
11

Không phải là tôi muốn sử dụng điều này thực tế (vì nhiều lý do), nhưng tò mò nghiêm ngặt tôi muốn biết nếu có một cách để đảo ngược thứ tự một chuỗi sử dụng các biểu thức LINQ và/hoặc LAMBDA trong một dòng mã, mà không sử dụng bất kỳ phương thức "Đảo ngược" nào trong khung.Bạn có thể đảo ngược thứ tự một chuỗi trong một dòng với LINQ hoặc biểu thức LAMBDA

ví dụ:

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

và reversedValue sẽ dẫn đến "em esrever"

EDIT Rõ ràng là một vấn đề không thực tế/giải pháp tôi biết điều này, vì vậy đừng lo lắng nó hoàn toàn là một câu hỏi tò mò xung quanh cấu trúc LINQ/LAMBDA .

+0

chỉ là một câu hỏi: Tại sao? –

+0

Im nhầm lẫn .... tại sao bạn không muốn sử dụng phương pháp Array.Reverse? – James

+1

LINQ hoặc lambda tốt hơn so với các phương thức chuỗi đầy đủ hơn? –

Trả lời

23

Tôi không thấy một thực tế sử dụng cho việc này nhưng chỉ vì lợi ích của niềm vui:

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

@Mehrdad, đừng lo lắng tôi sẽ không sử dụng nó thực tế nhưng đã cố gắng để đáp ứng sự tò mò cá nhân. –

27

Vâng, tôi có thể làm điều đó trong một dòng rất dài, ngay cả khi không sử dụng LINQ hoặc 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); 

(biên tập viên tiềm năng Kính gửi:. làm không Unwrap này lên nhiều dòng toàn bộ vấn đề là nó là một dòng duy nhất, theo câu trên nó và các câu hỏi.)

Tuy nhiên, nếu tôi thấy bất cứ ai tránh sử dụng các phương pháp khung vì lợi ích của nó, tôi sẽ đặt câu hỏi về sự tỉnh táo của họ.

Lưu ý rằng điều này không sử dụng LINQ. Một câu trả lời LINQ sẽ là:

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

Tránh sử dụng Reverse, nhưng sử dụng OrderByDescending thay vì:

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

Blech. Tôi thích câu trả lời của Mehrdad. Tất nhiên, tất cả những điều này kém hiệu quả hơn cách tiếp cận đơn giản.

Ồ, và tất cả đều sai. Đảo ngược một chuỗi phức tạp hơn đảo ngược thứ tự của các điểm mã. Xem xét kết hợp ký tự, cặp thay thế vv ...

+0

Crap. Tôi đã có một off bởi một lỗi hai lần trước khi tôi đã làm nó đúng, cho một vấn đề dễ dàng như vậy. Tôi muốn tránh cách tiếp cận của tôi bằng mọi giá! –

+1

Tôi không biết nếu đó chỉ là tôi, nhưng tôi không coi nó là một lớp lót nếu một người kết thúc câu lệnh; được sử dụng và một tuyên bố khác xuất hiện ngay sau đó. –

+0

@Josh: Cho rằng toàn bộ câu hỏi là phần nào vô lý IMO, tôi đã dùng nó hoàn toàn theo nghĩa đen. Đặt nó theo cách này - nếu bạn đã đi đến số dòng chứa mỗi câu lệnh trong mã đó, bạn sẽ nhận được bao nhiêu giá trị khác nhau? Nó chỉ cho thấy giá trị chính xác. –

5

Ngôn ngữ địa phương với lambda đệ quy:

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

Bạn không cần ToCharArray và chọn – nawfal

5

Bạn có thể sử dụng Aggregate để thêm vào trước mỗi Char vào chuỗi đảo ngược:

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

+1, nhưng đó là acc + c – dudeNumber4

+0

Đừng nghĩ vậy ... 'acc' đi' "" '->' "r" '->' "er" '-> '" ver "' -> '...' –

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

Câu hỏi tuyên bố 'mà không sử dụng bất kỳ khung "phương pháp" ngược lại nào'. – shamp00

+0

Hoặc 'string.Concat (value.Reverse())' – nawfal

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

Câu hỏi nêu rõ 'mà không sử dụng bất kỳ phương pháp "Reverse" nào trong khung làm việc. – shamp00

2

Ngoài một bài đăng trước đây ở đây là giải pháp hiệu quả hơn.

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

Khá đơn giản.Vì vậy, từ thời điểm này, tôi có một phương thức duy nhất để đảo ngược một chuỗi, không sử dụng bất kỳ hàm Reverse nào có sẵn.

Vì vậy, trong phương pháp chính của bạn, chỉ cần đi,

Console.WriteLine (Reverse ("Một số từ"));

Về mặt kỹ thuật đó là một trong lót của bạn: P

1

Nếu chúng ta cần phải hỗ trợ kết hợp ký tự và cặp thay thế:

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

Tài liệu: 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

Mười câu trả lời được đưa ra và bạn cần phải thêm một câu trả lời khác? Ngoài ra, một cái gì đó luôn luôn áp dụng cho các câu trả lời chỉ có mã là: đưa ra một giải thích ngắn gọn. Cuối cùng, câu hỏi nêu rõ * mà không sử dụng bất kỳ phương pháp "Reverse" nào trong khuôn khổ *. –

Các vấn đề liên quan