鑑於以下接口和兩個類:簡化與LINQ foreach循環(選擇在每一次迭代的兩個對象)
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}
我的問題是,如何使用LINQ簡化foreach
循環邏輯?我認爲可能有一個優雅的方式與SelectMany
操作符相同,但我無法生成相同的輸出。
請注意,與「SelectMany」不同,它不給出與OP原始代碼相同的順序。我還建議使用'Concat'而不是'Union'作爲集合行爲還沒有被指定......最後,你需要使用接口指定類型參數,否則將不能編譯。 –