C# 使用给定枚举的所有元素和LINQ中的间歇其他元素进行枚举
我有一个函数C# 使用给定枚举的所有元素和LINQ中的间歇其他元素进行枚举,c#,linq,C#,Linq,我有一个函数f()和一个IEnumerable,我想从中创建另一个IEnumerable,这样对于原始枚举中的每个字符串s,新的字符串都有s和f(s)。元素的顺序很重要 例如: IEnumerable<string> given = { "A", "B", "C" }; IEnumerable<string> wanted = { "A", f("A"), "B", f("B"), "C", f("C") }; IEnu
f()
和一个IEnumerable
,我想从中创建另一个IEnumerable
,这样对于原始枚举中的每个字符串s
,新的字符串都有s
和f(s)
。元素的顺序很重要
例如:
IEnumerable<string> given = { "A", "B", "C" };
IEnumerable<string> wanted = { "A", f("A"), "B", f("B"), "C", f("C") };
IEnumerable给定={“A”、“B”、“C”};
IEnumerable={“A”,f(“A”),“B”,f(“B”),“C”,f(“C”)};
有没有一种方法可以使用LINQ优雅地实现这一点?(如果不是,最优雅的方式是什么?)
将序列的每个元素投影到另一个序列,然后将生成的序列展平为单个序列
在查询语法中:
var wanted = from s in given
from item in new[] {s, f(s)}
select item;
另一种选择(如果订购不重要):
像这样的东西怎么样:
public static IEnumerable<string> AddFuncCall(this IEnumerable<string> input)
{
foreach (string s in input)
{
yield return s;
yield return "f(" + s + ")";
}
}
公共静态IEnumerable AddFuncCall(此IEnumerable输入)
{
foreach(输入中的字符串s)
{
收益率;
收益率回报率“f”(+s+)”;
}
}
如果您需要在字符串中嵌入引号,请尝试以下方法(语法上不是100%确定):
公共静态IEnumerable AddFuncCall(此IEnumerable输入)
{
foreach(输入中的字符串s)
{
收益率回报率@“s+”;
收益率回报率为“f”(“+s+)”);
}
}
给定的IEnumerable={“A”、“B”、“C”};
IEnumerable=gived.AddFuncCall();
[编辑]
抱歉,我误解了这个问题,我以为您希望在输出中使用类似“f(“A”)的字符串,而不是在输入的每个字符串上执行
f
。哎呀 它不是“f(A)”
,而是f(“A”)
。(或者我遗漏了什么?)无论如何,写一个这样的方法对我来说似乎不是很优雅;这是在C#2中实现这一点的一个好方法,当然不是扩展方法。(我不认为这个小问题被误读在这里是很重要的)“阿尼:我没有认为误解是那么重要,我只是想排除我错过了什么。尽管如此,我还是在新[]{s,f(s)}select项中的给定from项中找到了您的from代码>比为此编写一个特殊方法要简单得多(也称为“更优雅”)。@sbi:我完全同意;在C#3之后,编写迭代器块已经成为一种罕见的现象,至少对我来说是这样。但是我认为这对于其他阅读这个问题的人来说是很好的,特别是那些仍然在C#2上的人,他们可以看到如何在没有LINQ的情况下获得“简单”的延迟执行查询。
var wanted = given.Concat(given.Select(f)); // C# 4
var wanted = given.Concat(given.Select(s => f(s))); // C# 3
public static IEnumerable<string> AddFuncCall(this IEnumerable<string> input)
{
foreach (string s in input)
{
yield return s;
yield return "f(" + s + ")";
}
}
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();