是否有可能用Linq替换这个foreach循环?

Mic*_*l J 3 c# linq foreach

我有一个foreach循环,我想用Linq查询替换,但我无法弄清楚如何编写查询.请参阅下面的示例和TIA.

using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication
{
    class ExampleProgram
    {
        static void Main( string[] args )
        {
            Device device = new Device();

            // The goal is to populate this list.
            var list1 = new List<IMemory>();

            // I would like to replace this loop with a Linq query
            foreach( MemoryBank memoryBank in device.MemoryBanks )
            {               
                list1.Add( memoryBank ); // add the memory bank

                foreach( MemoryBlock memoryBlock in memoryBank.MemoryBlocks )
                    list1.Add( memoryBlock ); // add the memory block
            }

            //var list2 = from memoryBank in device.MemoryBanks
            //            from memoryBlock in memoryBank.MemoryBlocks
            //            select ???;
        }
    }

    interface IMemory 
    {}

    public class Device
    { 
        public IList<MemoryBank> MemoryBanks { get; set; } 
    }

    public class MemoryBank : MemoryBlock, IMemory
    {
        public IList<MemoryBlock> MemoryBlocks { get; set; } 
    }

    public class MemoryBlock : IMemory 
    { }
}
Run Code Online (Sandbox Code Playgroud)

Ani*_*Ani 5

你可以做:

var list1 = device.MemoryBanks
                  .SelectMany(m => new[] { m }.Concat(m.MemoryBlocks))
                  .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,这将创建一个List<MemoryBlock>而不是List<IMemory>样本中的.要创建接口类型列表,请进行最终调用ToList<IMemory>().

编辑:

在.NET 3.5中,IEnumerable<T>接口不是协变的,您可以这样做:

var list1 = device.MemoryBanks
                  .SelectMany(m => new IMemory[] { m }
                                       .Concat(m.MemoryBlocks.Cast<IMemory>()))
                  .ToList();
Run Code Online (Sandbox Code Playgroud)