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);
但我想知道是否有更好的解决方案来创建临时列表?
I have an example class such as:
class Foo
{
Int32 A;
IEnumerable<Int32> B;
}
Is it possible to transform an enumerable of Foo to an enumerable of Int32, which would include the A and the contents of B from all Foo's?
A non-LINQ solution would be:
var ints = new List<Int32>();
foreach (var foo in foos) {
ints.Add(foo.A);
ints.AddRange(foo.B);
}
The closest I could think of is:
var ints = foos.SelectMany(foo => var l = new List { foo.A }; l.AddRange(foo.B); return l);
But I wonder if there is a better solution that creating a temporary list?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这应该可行:
基本方法是通过创建一个包含
fA
元素的数组,将其连接到fB
的现有枚举,最后创建一个包含一个元素的新枚举。使用SelectMany()
展平序列This should work:
Basic approach is to create a new enumeration with one element by creating an array with one element which is
f.A
, concatenating this to the existing enumeration off.B
and finally flatten the sequence withSelectMany()
作为每个非 Linq 示例的
List
var ints = Foo.B.ToList().Add(Foo.A);
更懒惰的 Linq 式解决方案
var ints = Foo.B.Concat(new Int32[] {Foo.A})
as a
List<Int32>
per your non-Linq examplevar ints = Foo.B.ToList().Add(Foo.A);
Lazy more Linq-ish solution
var ints = Foo.B.Concat(new Int32[] {Foo.A})
如果您特别需要
fA
位于fB
中的所有元素之前:If you specifically need
f.A
before all elements fromf.B
: