2010-10-03 22 views
6

Nói rằng tôi có một loạt các string s như thế này:Trong LINQ, tôi có thể chọn nhiều mục không?

string [] foos = { 
    "abc", 
    "def", 
    "ghi" 
}; 

Tôi muốn có một bộ sưu tập mới có chứa mỗi chuỗi và ngược lại của nó. Vì vậy, kết quả nên là:

"abc", 
    "cba", 
    "def", 
    "fed", 
    "ghi", 
    "ihg" 

Tôi chỉ có thể lặp qua mảng, nhưng điều này là khá vụng về:

string Reverse (string str) 
{ 
    return new string (str.Reverse().ToArray()); 
} 

List<string> results = new List<string>(); 
foreach (string foo in foos) { 
    results.Add (foo); 
    results.Add (Reverse(str)); 
} 

Có cách nào để làm điều này trong LINQ? Một cái gì đó như

var results = from foo in foos 
    select foo /* and also */ select Reverse(foo) 

Trả lời

13
var result = from foo in foos 
      from x in new string[] { foo, Reverse(foo) } 
      select x; 

hoặc

var result = foos.SelectMany(foo => new string[] { foo, Reverse(foo) }); 

này maps mỗi foo trong foos để một mảng bao gồm hai yếu tố: fooReverse(foo). Sau đó, nó nối tất cả các mảng hai phần tử này thành một đơn, lớn đếm được.

 
{       {        { 
"abc",       { 
           "abc",     "abc", 
           "cba",     "cba", 
           }, 
"def",   =>    {    => 
           "def",     "def", 
           "fed",     "fed", 
           } 
"ghi",       { 
           "ghi",     "ghi", 
           "ihg",     "ihg", 
           } 
}       }        } 

Nếu thứ tự của đầu ra của bạn không phải là quá quan trọng, bạn cũng có thể nối các mảng ban đầu với kết quả của việc lập bản đồ mỗi phần tử trong mảng ban đầu bằng cách sử dụng phương pháp Reverse:

var result = foos.Concat(from foo in foos select Reverse(foo)); 

hoặc

var result = foos.Concat(foos.Select(Reverse)); 
 
{        {        { 
"abc",       "abc",       "abc", 
"def",   =>    "def",   =>    "def", 
"ghi",       "ghi",       "ghi", 
}        } 
           concat 
           { 
           "cba",       "cba", 
           "fed",       "fed", 
           "ihg",       "ihg", 
           }        } 

+0

Cảm ơn! Tôi đã kết thúc bằng cách sử dụng 'foos.Concat (foos.Select (Reverse));', vì thứ tự không quan trọng, nhưng những thứ về mệnh đề 'from' lồng nhau là thông tin tốt để giấu đi trong tương lai. –

0

Tôi nghĩ rằng những gì sau của bạn là như sau:

static void Main(string[] args) 
    { 
     string[] foos = { "abc", "def", "ghi" }; 
     string[] result = foos.Union(foos.Select(A=> new string(A.ToCharArray().Reverse().ToArray()))).ToArray(); 
     foreach(string a in result) Debug.WriteLine(a); 
    } 

Các "thủ thuật":

  • Sử dụng các công đoàn để dẫn đến một chuỗi.
  • Chuyển đổi chuỗi thành một Char [], và ngược lại rằng chuỗi
  • Sử dụng chuỗi nhà xây dựng mà phải mất một char [] để xây dựng một chuỗi mới cho chuỗi
Các vấn đề liên quan