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

时间:2010-10-03 16:30:41

标签: c# .net linq

说我有string这样的数组:

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 个答案:

答案 0 :(得分:13)

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映射到一个由两个元素组成的数组:fooReverse(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",
                                }                               }

答案 1 :(得分:0)

我认为您的后续内容如下:

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

“技巧”:

  • 使用union生成一个序列。
  • 将字符串转换为Char [],并反转该序列
  • 使用字符串构造函数,它使用char []为序列构建新字符串