gpt4 book ai didi

c# - 是否可以用 Linq 替换这个 foreach 循环?

转载 作者:行者123 更新时间:2023-11-30 14:40:24 27 4
gpt4 key购买 nike

我有一个 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
{ }
}

最佳答案

你可以这样做:

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

请注意,这将创建一个 List<MemoryBlock>而不是 List<IMemory>就像你的样本一样。要列出接口(interface)类型,请最后调用 ToList<IMemory>() .

编辑:

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

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

关于c# - 是否可以用 Linq 替换这个 foreach 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com