在LINQ中,我可以选择多个项目吗?

Mat*_*hew 6 .net c# linq

假设我有一个string像这样的数组:

string [] foos = {
    "abc",
    "def",
    "ghi"
};
Run Code Online (Sandbox Code Playgroud)

我想要一个包含每个字符串及其反向的新集合.所以结果应该是:

    "abc",
    "cba",
    "def",
    "fed",
    "ghi",
    "ihg"
Run Code Online (Sandbox Code Playgroud)

我可以遍历数组,但这非常笨拙:

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));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在LINQ中执行此操作?就像是

var results = from foo in foos
    select foo /* and also */ select Reverse(foo)
Run Code Online (Sandbox Code Playgroud)

dtb*_*dtb 13

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

要么

var result = foos.SelectMany(foo => new string[] { foo, Reverse(foo) });
Run Code Online (Sandbox Code Playgroud)

此将每个foofoos到由两个元件的阵列:fooReverse(foo).然后它将所有这些双元素数组连接成一个大的可枚举数组.

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

如果输出的顺序不那么重要,您还可以使用Reverse方法将原始数组与映射原始数组中每个元素的结果连接起来:

var result = foos.Concat(from foo in foos select Reverse(foo));
Run Code Online (Sandbox Code Playgroud)

要么

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