2010-10-03 31 views
6

Decir que tengo una serie de string s como esto:En LINQ, ¿puedo seleccionar varios elementos?

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

Quiero una nueva colección que contiene cada cadena y su inversa. Así, el resultado debería ser:

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

tan sólo pudiera iterar a través de la matriz, pero esto es bastante torpe:

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

¿Hay una manera de hacer esto en LINQ? Algo así como

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

Respuesta

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

o

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

Esto mapea cada foo en foos a una matriz que consta de dos elementos: foo y Reverse(foo). Luego concatena todos estos arreglos de dos elementos en un único enumerable grande.

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

Si el orden de su salida no es tan importante, también puede concatenar la matriz original con el resultado de la cartografía de cada elemento de la matriz original utilizando el método inverso:

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

o

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

+0

Gracias! Terminé usando 'foos.Concat (foos.Select (Reverse));', ya que el orden no importa, pero el contenido de las cláusulas 'from' anidadas es una buena información para guardar en el futuro. –

0

creo que lo que buscas es la siguiente:

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

Los "trucos":

  • utilizar la unión a resultar en una secuencia.
  • convertir la cadena en un char [], y la secuencia inversa que
  • utilizar el constructor de cadena que tiene un char [] para construir una nueva cadena de la secuencia
Cuestiones relacionadas