我有一个函数f()
和一个IEnumerable<string>
,我想从中创建另一个IEnumerable<string>
,以便对于原始枚举中的每个字符串s
,新的s
f(s)
{1}}和IEnumerable<string> given = { "A", "B", "C" };
IEnumerable<string> wanted = { "A", f("A"), "B", f("B"), "C", f("C") };
。元素的顺序很重要。
示例:
{{1}}
使用LINQ有没有办法优雅地? (如果没有,那么最优雅的方法是什么?)
答案 0 :(得分:8)
var wanted = given.SelectMany(s => new[] {s, f(s)} );
Enumerable.SelectMany
将序列的每个元素投射到另一个序列,然后将生成的序列序列展平为单个序列。
在查询语法中:
var wanted = from s in given
from item in new[] {s, f(s)}
select item;
另一种选择(如果订购并不重要):
var wanted = given.Concat(given.Select(f)); // C# 4
var wanted = given.Concat(given.Select(s => f(s))); // C# 3
答案 1 :(得分:1)
这样的事情:
public static IEnumerable<string> AddFuncCall(this IEnumerable<string> input)
{
foreach (string s in input)
{
yield return s;
yield return "f(" + s + ")";
}
}
如果您需要字符串中嵌入的引号,请尝试此操作(语法不是100%确定):
public static IEnumerable<string> AddFuncCall(this IEnumerable<string> input)
{
foreach (string s in input)
{
yield return @""" + s + @""";
yield return @"f("" + s + @"")";
}
}
IEnumerable<string> given = { "A", "B", "C"};
IEnumerable<string> wanted = given.AddFuncCall();
[编辑]
对不起,我误解了这个问题,我认为你想在输出中输入像“f(”A“)这样的字符串”,而不是在输入的每个字符串上执行f
。糟糕!