В LINQ можно выбрать несколько элементов?
скажем, у меня есть массив string
S, как это:
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[] для создания новой строки для последовательности