В 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[] для создания новой строки для последовательности