如何使用 linq 返回带有 IEnumerable<(字符串类别,IEnumerable<Product> 产品名称)>元组



我必须以元组的格式返回结果,但由于嵌套的foreach循环,我不能使用yield return(元组(。我该怎么办?

public static IEnumerable<(string category, IEnumerable<Product> productsName)> GroupJoinQuery()
{
string[] categories =
{
"Vegetables",
"Dairy Products",
"Seafood"
};
List<Product> products = Products.ProductList;
var q = categories.GroupJoin(products, c => c, p => p.Category, (c, ps)
=> new { Category = c, Products = ps });
foreach (var v in q)
{
Console.WriteLine($"{v.Category}:");
foreach (var p in v.Products)
{
Console.WriteLine($"   {p.ProductName}");
}
}
}

由于您希望每个类别返回一个元素,元组的第二个组件是与该类别匹配的产品的IEnumerable,因此以下操作会很好:

public static IEnumerable<(string category, IEnumerable<Product> productsName)> GroupJoinQuery()
{
string[] categories =
{
"Vegetables",
"Dairy Products",
"Seafood"
};
List<Product> products = Products.ProductList;
return (IEnumerable<(string category, IEnumerable<Product> productsName)>) 
categories.GroupJoin(products, c => c, p => p.Category, (c, ps)
=> new { Category = c, Products = ps.ToArray() });
}

注意ToArray()的使用。如果products最终由数据库填充,并且在处理完所需的上下文后迭代IEnumerable,则会得到运行时异常。对ToArray()的调用实现了结果(将其复制到内存中(。对于适度的结果大小,这是一个可以接受的策略。如果结果集是实质性的,您可能希望考虑另一种方法。

相关内容

最新更新