【问题标题】:Querying container with Linq + group by?用 Linq + group by 查询容器?
【发布时间】:2011-01-01 02:55:41
【问题描述】:

我有这门课:

public class ItemList
{
    public int GuID { get; set; }
    public int ItemID { get; set; }
    public string Name { get; set; }
    public entityType Status { get; set; }
    public int Zone { get; set; }

    public class Waypoint
    {
        public int SubID { get; set; }
        public int Heading { get; set; }
        public float PosX { get; set; }
        public float PosY { get; set; }
        public float PosZ { get; set; }
    }
    public List<Waypoint> Routes = new List<Waypoint>();
}

在此列表中使用: public List myList = new List();

新添加的项目是这样的:

ItemList newItem = new ItemList();
newItem.GUID = GUID;
newItem.ItemID = ItemID;
newItem.Name = Name;
newItem.Status = Status;

// Inner Routes List
ItemList.Waypoint itemLocation = new ItemList.Waypoint();
itemLocation.SubID = SubID;
itemLocation.Zone = Zone;
itemLocation.Heading = convertHeading(Heading);
itemLocation.PosX = PosX;
itemLocation.PosY = PosY;
itemLocation.PosZ = PosZ;
itemLocation.Rest = Rest;
newItem.Routes.Add(itemLocation);
myList.Add(newItem);

现在我需要按 ItemID 对其进行分组,并加入每个相同 ItemID 的 Routes 的第一个条目。

这将是public List&lt;ItemList&gt; myList = new List&lt;ItemList&gt;(); 数据的示例:

GUID    ItemID      ListOfRoutes
   1        20       GUID_1_Routes
   2        20       GUID_2_Routes
   3        20       GUID_3_Routes
   4        20       GUID_4_Routes
   5        20       GUID_5_Routes
   6        55       GUID_6_Routes
   7        55       GUID_7_Routes
   8        55       GUID_8_Routes
   9         1       GUID_9_Routes
  10         1      GUID_10_Routes

您可以看到 GUID 是唯一的,ItemID 可以自我重复。 每个 GUID 都有一个路由列表,所有路由列表至少有 1 个及以上条目。

Routes 是 ItemList public List&lt;Waypoint&gt; Routes = new List&lt;Waypoint&gt;(); 类的一部分

路线示例。

GUID_1_Routes 有:

Entry   Zone    SubID   Heading     PosX    PosY    PosZ
    1   1200        0       100     1029.32 837.21  29.10
    2   1200        0       120     1129.32 537.21  29.10
    3   1200        0       180     1229.32 137.21  29.10
    4   1200        0       360     1329.32 437.21  29.10
    5   1200        0       100     1429.32 637.21  29.10

GUID_2_Routes 有:

Entry   Zone    SubID   Heading     PosX    PosY    PosZ
    1    100        0       10      129.32  437.21  29.10

所以我想要做的是我在 myList 上按 ItemID 分组的所有条目的列表,维护字段 ItemID 和 Name ... 以及每个 ItemID 的新列表,它将存储来自每个 GUID 的每个路由的第一个元素具有相同的 ItemID。

例如 ItemID 20 将产生以下结果:

ItemID、名称、ListOfRoutes

这个 ItemID ListOfRoutes 将包含

GUID_1_Routes 第一个条目:

Entry   Zone    SubID   Heading     PosX    PosY    PosZ
    1   1200        0       100     1029.32 837.21  29.10

GUID_2_Routes 第一个条目:

Entry   Zone    SubID   Heading     PosX    PosY    PosZ
    1    100        0       10      129.32  437.21  29.10

GUID_3_Routes、GUID_4_Routes、GUID_5_Routes 第一个条目。

更新 2:

这就是我设法获得我想要的结果的方式,但我仍然相信通过单个查询或以比我目前使用的更好的方式可以实现:

        var query = from ItemList item in myList
                    where status.Contains(item.Status)
                    group item by new
                    {
                        item.ItemID,
                        item.Name,
                        item.Zone
                    }
                    into newList
                    orderby newList.Key.ItemID ascending
                    select new
                    {
                        newList.Key.ItemID,
                        newList.Key.Name,
                        newList.Key.Zone
                    };

        foreach (var thisItem in query)
        {
                var location = from n in myList
                               where n.ItemID == thisItem.ItemID
                               select new
                               {
                                   Routes = n.Routes.First()
                               };
                foreach (var thisObject in location)
                {
                    ItemList.Waypoint thisRoutes = thisObject.Routes;
                }
        }

【问题讨论】:

    标签: c# linq containers


    【解决方案1】:

    因此,您正在寻找的是我在第一个查询中的变体。我仍然不能 100% 确定我理解了你的解释,但根据你的输出,我相信这更多的是你想要做的。

    var query = from entry in myList
                where status.Contains(entry.Status)
                group entry.Routes.First() // take the first item in each route
                    by new // assuming each id has a unique name
                    {
                        entry.ItemID,
                        entry.Name
                    }
                    into g
                select new
                {
                    g.Key.ItemID,
                    g.Key.Name,
                    ListOfRoutes = g.ToList() // return the grouping as list
                };
    

    我不确定您想要的列表类型,请根据需要进行更改。

    【讨论】:

    • 首先祝大家新年快乐,感谢您的回答,我会尝试一下,更多地解释public List&lt;ItemList&gt; myList = new List&lt;ItemList&gt;(); 中的每个项目,其中包含路线列表public List&lt;Waypoint&gt; Routes = new List&lt;Waypoint&gt;(); 中的类,但有些项目有更多然后是 1 条路线,我需要每个项目的第一个条目。
    • @Prim:在我看来,第一个查询就是您要查找的内容。
    • @Jeff M 很遗憾,我无法将上述内容应用到我拥有的当前课程中,因此我也需要生成的查询
    • @Prix:哎呀,我才意识到我弄错了你的名字。对不起。 :) 您能否提供一些输入的更完整示例以及您的期望?我所展示的示例形式的内容对于描述您正在尝试做的事情非常有帮助。
    • @Jeff M 再次感谢,我已经更新了问题希望更新是可以理解的。
    【解决方案2】:
    • 在您的问题中,您说:“来自具有相同 ItemID 的每个 GUID。”
    • 在您的工作代码中,您根本不使用 GUID。

    -

    • 在您的问题中,您没有提到状态过滤。
    • 在您的工作代码中,有状态过滤。

    -

    无论如何,我已经将“工作代码”简化为几行。

    from ItemList item in myList
    where status.Contains(item.status)
    group item by item.ItemID into groupedItems
    order by groupedItems.Key descending
    let firstItem = groupedItems.First()
    let routes =
      from item2 in groupedItems
      select item2.Routes.First()
    from route in routes
    select new
    {
      TheItemList = firstItem,
      TheWayPoint = route
    };
    

    您需要学习如何通过操作查询分组的结果。在上面的代码中,我从每个组中提取了第一个元素,并投影了组中的每个元素,然后加入了该投影。

    您还应该更好地传达每个键标识的内容、列表中为什么有重复的项目 ID 以及为什么名为 ItemList 的类根本不是列表。

    【讨论】:

    • 感谢您的回复,祝您新年快乐;),我会尝试您的查询。关于 GUID,这是因为当我按 ItemID 对其进行分组时,无需检查 GUID,但您可以看到每个 GUID 都有一个路由列表,并且从该路由列表中我只需要第一个元素。因此,如果 ItemID 20 有 5 个 GUID 条目,则意味着我将有一个包含 5 个元素的路由列表,这是每个包含 ItemID 的 GUID 的第一个元素
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多