我必须以元组的格式返回结果,但由于嵌套的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()
的调用实现了结果(将其复制到内存中(。对于适度的结果大小,这是一个可以接受的策略。如果结果集是实质性的,您可能希望考虑另一种方法。