0

我想将以下代码转换为 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 语句。

感谢您的任何建议。

4

1 回答 1

1

List 和 Array 都是IQueriable,因此就 LINQ 而言没有区别。问题出在你的SelectMany()方法上。当您最后一个片段中的 LINQ 很好时,我不明白您为什么要这样写。

当然,您不能在第二个代码段中使用bandn作为 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 具有“更高的优先级”,可以这么说,实际发生的是:

  1. nodesEnumerable.SelectMany(b => b.propNodeBoardList)从所有节点返回一个扁平化List<BOARD>,我们称之为bList
  2. bList.SelectMany(d => d.propBoardDeviceList)从上一个函数返回的所有板中返回一个扁平设备列表
  3. 从中获取值的实际集合n是来自 2. 的设备列表,因此 n 实际上是 a DEVICE。您可以将鼠标光标悬停在 IntelliSense 上以确认这一事实。希望清除它
于 2013-05-29T21:52:59.620 回答