创建具有中间结果的Linq语句
本文关键字:Linq 语句 结果 中间 创建 | 更新日期: 2023-09-27 18:15:53
我想把下面的代码转换成Linq语句。
int x, y, z;
List<POINT> l = new List<POINT>();
foreach (NODE n in nodesEnumerable)
{
x = n.propNodeNumber;
foreach (BOARD b in n.propNodeBoardList)
{
y = b.propBoardNumber;
foreach (DEVICE d in b.propBoardDeviceList)
{
z = d.propDeviceNumber;
if (d.propDeviceInstalled == DEVICE_INSTALLED_Types.Enabled)
{
POINT p = new POINT();
p.propPointNodeNumber = x;
p.propPointSlotNumber = y;
p.propPointAddressNumber = z;
p.propObjectDevice = d;
l.Add(p);
}
}
}
}
foreach (POINT pp in l)
{
Console.WriteLine(pp.propObjectDevice.ToString());
}
我创建了下面的Linq语句来实现上面的代码,它部分工作,因为我能够在POINT对象中存储4个参数中的2个。注释行是我无法获得值的两个字段。
我需要在Linq过程中保存一些中间结果,但我现在无法做到。
我也不明白为什么n.p prodevicenumber工作时,我认为它应该是d.p prodevicenumber。
list = from n in nodesEnumerable
.SelectMany(b => b.propNodeBoardList)
.SelectMany(d => d.propBoardDeviceList)
where (n.propDeviceInstalled == DEVICE_INSTALLED_Types.Enabled)
select (new POINT()
{
//propPointNodeNumber =
//propPointSlotNumber = b.propBoardNumber,
propPointAddressNumber = n.propDeviceNumber,
propObjectDevice = n
});
foreach (POINT p in list)
{
Console.WriteLine(p.propObjectDevice.ToString());
}
我能够让Linq语句正常工作,因为当我使用BOARD[] BoardArray而不是LIST<> NodeBoardList和当我使用DEVICE[] DeviceArray而不是LIST<> BoardDeviceList时,我能够保存所有必要的中间结果来更新我的代码的早期版本中的POINT。Linq语句如下:
list =
from n in nodesEnumerable
from b in n.BoardArray
from d in b.DeviceArray
where d.propDeviceInstalled == DEVICE_INSTALLED_Types.Disabled
select (new POINT()
{
propPointNodeNumber = n.propNodeNumber,
propPointSlotNumber = b.propBoardNumber,
propPointAddressNumber = d.propDeviceNumber,
propObjectDevice = d
});
foreach (var p in list)
{
Console.WriteLine(p.ToString());
}
当我使用数组时,我能够让Linq语句工作,但我已经将所有代码转换为使用列表,现在我无法让Linq语句正常工作。在我的代码中使用列表在程序的所有其他方面都工作得更好,除了让这个Linq语句工作。
我真的想使用Linq语句而不是硬编码这个功能,因为我必须创建许多类似的Linq语句。
谢谢你的建议
List和Array都是IQueriable
,所以就LINQ而言没有区别。问题在于你的SelectMany()
方法。我不明白你为什么要这样写,当你上一个代码片段的LINQ是好的。
当然你不能使用b
和n
的2属性在你的第二个代码片段,因为他们是从一些以前的lambda表达式,他们没有任何关系与你的LINQ查询在那里。
我已经设置了一些虚拟类,并成功编译了linq(这几乎正是您的查询)
var nodes = new List<NODE>();
var linq = from n in nodes
from b in n.propNodeBoardList
from d in b.propBoardDeviceList
where d.propDeviceInstalled == 1
select new POINT()
{
propPointNodeNumber = n.propNodeNumber,
propPointSlotNumber = b.propBoardNumber,
propPointAddressNumber = d.propBoardDeviceNumber,
propObjectDevice = d
};
编辑:为了进一步澄清,当你写
时from n in nodesEnumerable
.SelectMany(b => b.propNodeBoardList)
.SelectMany(d => d.propBoardDeviceList)
考虑到这些方法比LINQ具有"更高的优先级",实际发生的情况是:
-
nodesEnumerable.SelectMany(b => b.propNodeBoardList)
从所有节点返回一个扁平的List<BOARD>
,我们叫它bList
-
bList.SelectMany(d => d.propBoardDeviceList)
从前一个函数 返回的所有板中返回一个扁平的设备列表 -
n
获取值的实际集合是来自2的设备列表。,所以n实际上是一个DEVICE
。您可以将鼠标光标悬停在它上面,让智能感知来确认这一事实。希望这能澄清