使用对象列表的LINQ查询属性

时间:2017-10-17 19:50:07

标签: c# linq

我试图破译自己如何做到这一点,但我对LINQ使用的理解非常有限。我所拥有的是两个类:

public class Grocery
{
    public string ItemName { get; set; }
    public List<ItemType> ItemTypes { get; set; }
}

public class ItemType
{
    public double Weight { get; set; }
    public long Quantity { get; set; }
}

您的想法是Grocery ItemName对象与ItemTypes&#34; Carrots&#34;,并且有两个不同的List<Grocery> groceries; ,例如其中Weight = 1lb,其中Weight = 2lb,每个的数量不同。显然,除了胡萝卜之外,还会有更多项目,这些项目也存储在列表中:

List<long> quantities = new List<long>();

foreach (Grocery grocery in groceries)
{
    foreach (ItemType itemType in grocery.ItemTypes)
    {
        if (itemType.Weight == 1)
        {
            quantities.Add(itemType.Quantity);
        }
    }
}

我想要做的是获得所有杂货的所有数量的清单,给定一定的重量。例如。对于所有具有1磅类型的项目,我可以这样做:

.ForEach

我想知道的是如何使用LINQ表达式实现相同的结果,但我不确定如果不回复使用app.get('/', (req, res) => { // want to get the data in here res.render('index', data); }) 并且只是做同样的事情就可以做到这一点上面的代码,但是更简洁(因此不太可读)的方式。感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

正如里诺所说,SelectMany是要走的路。但是,不是使用ForEach来填充列表,而是一直使用LINQ:

List<long> quantities = groceries.SelectMany(g => g.ItemTypes)
    .Where(t => t.Weight == 1)
    .Select(t => t.Quantity)
    .ToList();

答案 1 :(得分:3)

您可以使用SelectMany实现此目的。要复制foreach处理,您可以使用以下内容:

List<long> quantities = groceries.SelectMany(x => x.ItemTypes)
    .Where(x => x.Weight == 1)
    .Select(x => x.Quantity)
    .ToList();

为了获得每个Grocery的数量清单,正如您在问题中提到的那样,您可以使用以下内容:

var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    Quantities = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Select(it => it.Quantity)
        .ToList()
}).ToList();

这将创建一个匿名对象列表,看起来像这样(在JSON中用于演示):

[
    {
        "ItemName": "Grocery #1",
        "Quantities": [1, 2, 3]
    },
    ...
]

您可以对数量进行求和,如果这是您实际使用的数量。这看起来像这样:

var groceryQuantities = groceries.Select(g => new
{
    g.ItemName,
    TotalQuantity = g.ItemTypes
        .Where(it => it.Weight == 1)
        .Sum(it => it.Quantity)
}).ToList();

你可以做其他一些事情,但这应该涵盖一种方法来解决这个问题。

答案 2 :(得分:0)

SelectMany是你的朋友:

SELECT blog_category 
FROM blog_posts 
GROUP BY blog_category
HAVING COUNT(*) >= 3;