我有一个示例类,例如:
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);
但我想知道是否有更好的解决方案来创建临时列表?
答案 0 :(得分:2)
这应该有效:
var results = foos.SelectMany(f => f.B.Concat(new[] { f.A}));
基本方法是通过创建一个包含一个f.A
元素的数组,创建一个包含一个元素的新枚举,将其与f.B
的现有枚举连接起来,最后用{{1}展平序列}}
答案 1 :(得分:0)
作为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));