我试图破译自己如何做到这一点,但我对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);
})
并且只是做同样的事情就可以做到这一点上面的代码,但是更简洁(因此不太可读)的方式。感谢您的帮助。
答案 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;