具有困难条件的c# LINQ Get列表子集
本文关键字:LINQ Get 列表 子集 条件 | 更新日期: 2023-09-27 18:01:45
我有一些Product
结构,例如,我有ProductId
和ProductVariantId
。每种产品都有许多变体。例如,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
,并获得最大值。
请帮我一下好吗?
您可以使用这种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);
}