如何使用linq返回IEnumerable〈(字符串类别,IEnumerable < Product>productsName)>的元组

eh57zj3b  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(149)

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

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}");
                }
            }
        }
b4qexyjb

b4qexyjb1#

由于您希望为每个类别返回一个元素,元组的第二个组成部分是与该类别匹配的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,则会出现运行时异常。(将其复制到内存中)。对于中等大小的结果,这是可接受的策略。如果结果集很大,您可能希望考虑一种不同方法。

相关问题