Linq转换

时间:2011-03-09 22:05:49

标签: linq

我有一个示例类,例如:

class Foo 
{ 
    Int32 A; 
    IEnumerable<Int32> B; 
}

是否可以将可枚举的Foo转换为可枚举的Int32,其中包括所有Foo的A和B的内容?

非LINQ解决方案将是:

var ints = new List<Int32>();
foreach (var foo in foos) {
    ints.Add(foo.A);
    ints.AddRange(foo.B);
}

我能想到的最接近的是:

var ints = foos.SelectMany(foo => var l = new List { foo.A }; l.AddRange(foo.B); return l);

但我想知道是否有更好的解决方案来创建临时列表?

3 个答案:

答案 0 :(得分:2)

这应该有效:

var results = foos.SelectMany(f => f.B.Concat(new[] { f.A}));

基本方法是通过创建一个包含一个f.A元素的数组,创建一个包含一个元素的新枚举,将其与f.B的现有枚举连接起来,最后用{{1}展平序列}}

答案 1 :(得分:0)

根据您的非Linq示例

作为List<Int32>

var ints = Foo.B.ToList().Add(Foo.A);

懒惰更多Linq-ish解决方案

var ints = Foo.B.Concat(new Int32[] {Foo.A})

答案 2 :(得分:0)

var ints = foos.SelectMany(f => f.B.Concat(new int[] { f.A}));

如果你特别需要f.A 之前来自f.B的所有元素:

var ints = foos.SelectMany(f => (new int[] { f.A }).concat(f.B));