【问题标题】:Get element from collection, depending on subcollection从集合中获取元素,取决于子集合
【发布时间】:2015-03-05 09:05:47
【问题描述】:

这是我的班级结构:

Public Class Product
    Dim productRef As string 
    Dim totalStock As Integer
    Dim sizes As List(of ProdSize)
End Class
Public Class ProdSize
    Dim stock As Integer
    Dim size As String
End Class

我有一些产品存储在List (of ProdSize) 中。我需要提取库存值 > 0 的产品。我使用以下代码得到了这个:

FinalList = (From p In ProductList Where p.totalStock > 0 Select p).toList()

但现在要求发生了变化,我需要获得具有特定尺寸和库存 > 0 的 ProdSize 的产品。

例如:

Prod A, Size M, Stock 1
Prod A, Size S, Stock 0
Prod B, Size M, Stock 0
Prod B, Size S, Stock 1
Prod C, Size M, Stock 1
Prod C, Size S, Stock 1

当我查找尺寸“M”时,我想在我的列表 FinalList 中获取产品 A 和 C。

有没有办法用一个 LINQ 来获得这个? 提前致谢!

编辑

我忘了说我需要使用ProdSize类的属性:stocksize

【问题讨论】:

  • 如果我正确理解了您的问题,这应该有效:-FinalList = (From p In ProductList Where p.totalStock > 0 AndAlso p.Size = "M" Select p).ToList()
  • @RahulSingh,将其发布为答案,我会保证支持它;)
  • @RahulSingh,这不起作用。 totalStock 是所有大小的总和。我需要使用ProdSize 类中的属性stocksize
  • @RahulSingh,我不是提问者;)
  • @MaciejLos - 好吧,我的错!但是 OP 的问题并不清楚,这就是我将其作为评论发布的原因。

标签: vb.net linq list collections


【解决方案1】:

试试这个:-

FinalList = (From p In ProductList Where p.totalStock > 0 
                        AndAlso p.Size = "M" Select p).ToList()

编辑:

您提供的数据似乎与您提供的类的数据不匹配,尽管我已经根据您的类使用了该示例数据并用 C​​# 编写了这个(希望您可以将 Lambda 转换为 @987654324 @在VB中):-

var FinalList = productList
              .SelectMany(x => x.sizes, 
                   (prodObj, Sizes) => new 
                               { prodObj.productRef, Sizes })
              .Where(x => x.Sizes.size == "M" && x.Sizes.stock > 0)
              .Select(x => new
                        {
                            ProductName = x.productRef,
                            Size = x.Sizes.size,
                            Stock = x.Sizes.stock
                         }).ToList();

查看Fiddle,查看我使用过的示例数据和查询。

【讨论】:

    【解决方案2】:

    这就是我相信你所追求的:

    Dim FinalList = (From p In ProductList
                     Where p.sizes.Any(Function(x) x.stock > 0 AndAlso x.size = "M")
                     Select p).ToList()
    

    虽然“M”是硬编码的,但我相信您可以想办法在别处删除它。

    让我知道这是否有效。

    结果:

    【讨论】:

    • 这正是我想要的!谢谢!
    • 不用担心,很高兴它有所帮助。
    猜你喜欢
    • 2016-02-26
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多