给定以下接口和两个类:
public interface IMyObj
{
int Id { get; set; }
}
public class MyObj1 : IMyObj
{
public MyObj1(int id) { Id = id; }
public int Id { get; set; }
public override string ToString() => $"{GetType().Name} : {Id}";
}
public class MyObj2 : IMyObj
{
public MyObj2(int id) { Id = id; }
public int Id { get; set; }
public override string ToString() => $"{GetType().Name} : {Id}";
}
并给出使用它们的以下逻辑:
var numbers = new[] { 1, 5, 11, 17 };
var list = new List<IMyObj>();
foreach (var n in numbers)
{
// I'd like to simplify this part with LINQ...
list.Add(new MyObj1(n));
list.Add(new MyObj2(n));
}
Assert.AreEqual(8, list.Count);
测试通过,我看到了里面list
正是我想要的 - 每个数字两个对象实例:
Count = 8
[0]: {MyObj1 : 1}
[1]: {MyObj2 : 1}
[2]: {MyObj1 : 5}
[3]: {MyObj2 : 5}
[4]: {MyObj1 : 11}
[5]: {MyObj2 : 11}
[6]: {MyObj1 : 17}
[7]: {MyObj2 : 17}
我的问题是,如何简化foreach
使用 LINQ 循环逻辑?我想可能有一种优雅的方式来做同样的事情SelectMany https://msdn.microsoft.com/en-us/library/bb534336(v=vs.110).aspx也许是运算符,但我无法产生相同的输出。
SelectMany
确实是你想要的:
var list = numbers.SelectMany(n => new IMyObj[] { new MyObj1(n), new MyObj2(n) })
.ToList();
换句话说,对于每个数字,创建一个二元素数组,然后使用以下方法将其展平SelectMany
.
The new IMyObj[]
部分是必需的而不仅仅是new[]
因为类型推断无法判断您想要什么数组类型。如果类型相同,您可以执行以下操作:
var list = numbers.SelectMany(n => new[] { new MyObj(n), new MyObj(n) })
.ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)