В LINQ можно выбрать несколько элементов?

скажем, у меня есть массив stringS, как это:

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

Я хочу новую коллекцию, которая содержит каждую строку и наоборот. Так что результат должен быть:

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

я мог бы просто перебирать массив, но это довольно неуклюже:

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

есть ли способ сделать это в LINQ? Что-то вроде

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

2 ответов


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

или

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

это карты каждый foo на foos массиву, состоящему из двух элементов:foo и Reverse(foo). Затем он объединяет все эти двухэлементные массивы в один большой перечислимый.

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

если порядок вывода не так важен, вы также можете объединить исходный массив с результатом сопоставления каждого элемента в исходном массиве с помощью обратного метод:

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

или

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


Я думаю, что Ваш после это следующее:

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

"трюков":

  • используйте объединение, чтобы привести к одной последовательности.
  • преобразовать строку в Char [] и отменить эту последовательность
  • используйте конструктор строк, который принимает char[] для создания новой строки для последовательности