我想将以下代码转换为 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 语句来实现上面的代码,它的部分作用在于我能够将 4 个参数中的 2 个存储在 POINT 对象中。注释行是我无法获得值的两个字段。
我需要在 Linq 过程中保存一些中间结果,而我现在无法做到。
当我认为它应该是 d.propDeviceNumber 时,我也不明白为什么 n.propDeviceNumber 有效。
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 时,我能够保存在早期版本的代码中更新 POINT 所需的所有中间结果我使用 DEVICE[] DeviceArray 而不是 LIST<> BoardDeviceList。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 语句。
感谢您的任何建议。