说我有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)
答案 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
映射到一个由两个元素组成的数组: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", } }
答案 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);
}
“技巧”: