使用给定枚举的所有元素进行枚举,并在LINQ中插入其他元素

时间:2010-11-11 14:45:17

标签: c# linq

我有一个函数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有没有办法优雅地? (如果没有,那么最优雅的方法是什么?)

2 个答案:

答案 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。糟糕!