C#LINQ获取条件困难的列表子集

时间:2015-07-09 12:38:15

标签: c# linq list

我有一些Product结构,例如我ProductIdProductVariantId。每种产品都可以有许多变体。 例如,Product1可以包含变体1和2. Product2可以包含变体1,2和3,因此我有以下列表:

ProductId: 1, ProductVariantId 1
ProductId: 1, ProductVariantId 2
ProductId: 2, ProductVariantId 1
ProductId: 2, ProductVariantId 2
ProductId: 2, ProductVariantId 3

我想要的是获取productId只有一个给定的变体。当productId没有给定变体时,我的机制应该取最大值。

因此,给定变体3的示例应如下所示:

ProductId: 1, ProductVariantId 2 (maximum)
ProductId: 2, ProductVariantId 3

我试图这样做:

products.ToList().Where(x => x.ProductVariant == givenProductVariant)

我要添加的是distinct上的某种数据库productId并获得最大值。

请问一些帮助吗?

2 个答案:

答案 0 :(得分:6)

您可以使用GroupBy方法,bool ProductVariantId = 3ProductVariantId desc代替int productVariantId = 3; var query = products.GroupBy(p => p.ProductId) .Select(g => g.OrderByDescending(p => p.ProductVariantId == productVariantId) .ThenByDescending(p => p.ProductVariantId) .First()); // First ensures that we get one row per group

fetchResultsController

答案 1 :(得分:0)

class Product
        {
            public int ProductId { get; set; }
            public int ProductVariantId { get; set; }
        }

        static void GetMaxProduct(IList<Product> list,int variant)
        {
            var query = from l in list
                        group l by l.ProductId into g
                        select g.FirstOrDefault(x => x.ProductVariantId == variant) ?? g.OrderBy(x => x.ProductVariantId).Last();
            foreach (Product p in query)
            {
                Console.WriteLine("ProductId:" + p.ProductId + " ProductVariantId:" + p.ProductVariantId);
            }
        }

        static void Main(string[] args)
        {
            List<Product> list = new List<Product>()
            {
                new Product{ ProductId=1, ProductVariantId=1},
                new Product{ ProductId=1, ProductVariantId=2},
                new Product{ ProductId=2, ProductVariantId=1},
                new Product{ ProductId=2, ProductVariantId=2},
                new Product{ ProductId=2, ProductVariantId=3},
            };

            GetMaxProduct(list, 3);
            GetMaxProduct(list, 4);
            GetMaxProduct(list, 1);
        }