Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用给定枚举的所有元素和LINQ中的间歇其他元素进行枚举_C#_Linq - Fatal编程技术网

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