【问题标题】:LINQ - list group byLINQ - 列表分组
【发布时间】:2013-11-27 02:22:36
【问题描述】:

我在使用具有对象列表的类时遇到问题 - 基本上它是一个购物车,您可以在其中添加物品。我希望这些项目按项目 ID 分组,这样它们就不会在购物车中出现更多次。

所以如果你添加一个项目,然后再次添加它,它应该显示为 1 行,数量 =2,而不是 2 行数量 1。

首先,有没有办法以这种方式自动组织列表?

如果没有,那么我需要另一个 var:

var l = from i in list.cartItems
group i by i.id into g
select g.ToList();

list.cartItems = l;

list 是对象,cartItems 是列表,l 是要“刷新”的新列表

但是,这会导致我出错:

无法将类型“System.Collections.Generic.IEnumerable>”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

有什么想法吗?

谢谢

编辑: 我编辑了错误

Cartitems 只是: 公共列表 cartItems;

在 CartItemList 类中

【问题讨论】:

  • 你能提供cartItems的声明吗?
  • 是的,做到了,但这只是一个列表

标签: linq lambda


【解决方案1】:

你应该指定你想要的分组元素,像这样:

list.cartItems = l.First();

你的 cartItems 是一个 'ListOfItems' 类型,而你的 var l 是一个新的分组类型,它是 'int,ListOfItems' 类型。因此,要将您的“int,ListOfItems”转换为“ListOfItems”的cartItems,您应该从结果集合中选择某个元素。

【讨论】:

  • 这只是获取第一项,我如何获取全部?至少没有错误,谢谢!
  • @user1479059 你不应该把它投射到 list.cartItems。只需使用结果 l 集合。为什么要将其投射到 cartItems?它没有意义,因为它们是两个不同的集合。
  • 好吧,我是个菜鸟,所以我不太了解这些东西......即使你刚才说的,我也不知道
  • @user1479059 您似乎不太了解自己在做什么。您的商店中有一些商品。然后按型号对它们进行分组。它成为模型的集合,其中包含您的项目的子集合。然后您尝试将这个新的子集合集合回退到第一个集合。项目的集合和按模型分组的项目集合是两个不同的东西,你不能将一个转换为另一个。您只能从分组中选择一些子集合并将其转换为基本项目集合,因为它们是相同的。
【解决方案2】:

为了解决您需要在查询中更改选择子句 - 在选择中您可以像这样应用聚合函数:

var l = (from i in list.cartItems
        group i by i.id into g
        select new CartItem(){Id=g.Key, quantity=g.Count()}).ToList();

list.cartItems = l;  

尝试有效的示例

var t = Enumerable.Range(1, 10).Select(i => new { Id = i % 3, Q = 1 }).ToList();
var b = from i in t
        group i by i.Id into g
        select new { Id = g.Key, Q = g.Count() };
t = b.ToList();

并检查您的输入

【讨论】:

  • 假设这不起作用,因为 CartItem 没有数量属性。
  • @voo 当然,这是一个示例,我不知道CartItem是什么@
  • 是的,现在我添加的所有项目都显示出来了,但是不管数量只有1...有一个q而不是数量
  • 是的,但是为什么每个项目的数量只有 1 - 所以如果我添加 1 本书,然后再次添加同一本书,它应该是 2... 就好像 Count 无法正常工作它应该
  • 你能提供样本输入cartItems吗?如果您按每个组中的唯一字段分组将是一个元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多