具有困难条件的c# LINQ Get列表子集

本文关键字:LINQ Get 列表 子集 条件 | 更新日期: 2023-09-27 18:01:45

我有一些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)

我想在productId上添加一些数据库distinct,并获得最大值。

请帮我一下好吗?

具有困难条件的c# LINQ Get列表子集

您可以使用这种GroupBy方法,如果ProductVariantId = 3,则按bool排序,或者按ProductVariantId 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
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);
        }