提问人:sbi 提问时间:11/11/2010 更新时间:11/11/2010 访问量:195
具有给定枚举的所有元素的枚举以及 LINQ 中间歇性的其他元素的枚举
Enumeration with all elements of given Enumeration and intermitted other elements in LINQ
问:
我有一个函数和一个,我想从中创建另一个函数,以便对于原始枚举中的每个字符串,新字符串具有 和 。元素的顺序很重要。f()
IEnumerable<string>
IEnumerable<string>
s
s
f(s)
例:
IEnumerable<string> given = { "A", "B", "C" };
IEnumerable<string> wanted = { "A", f("A"), "B", f("B"), "C", f("C") };
有没有办法使用 LINQ 优雅地做到这一点?(如果没有,最优雅的方法是什么?
答:
8赞
Ani
11/11/2010
#1
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赞
wageoghe
11/11/2010
#2
像这样的东西呢:
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
评论
0赞
sbi
11/11/2010
不是 ,而是 .(还是我错过了什么?无论如何,为此编写方法对我来说似乎不是很优雅。"f(A)"
f("A")
0赞
Ani
11/11/2010
+1:这很好;这是在 C# 2 中执行此操作的好方法,当然除了扩展方法。(我不认为误读的轻微问题在这里并不那么重要)
0赞
sbi
11/11/2010
@Ani:我不认为误读那么重要,我只是想排除我遗漏了什么。尽管如此,我发现你比为此编写一个特殊的方法更容易阅读和理解(又名“更优雅”)。from s in given from item in new[] {s, f(s)} select item;
0赞
Ani
11/11/2010
@sbi:我完全同意;在 C# 3 之后,至少对我来说,编写迭代器块已经很少见了。但我认为这对阅读此问题的其他人(尤其是仍在使用 C# 2 的人)有好处,看看如何在没有 LINQ 的情况下获得“简单”的延迟执行查询。
上一个:概括需要处理不同数据成员的算法
评论