C# Linq选择分组列表的最后一项

C# Linq选择分组列表的最后一项,c#,linq,C#,Linq,我会尽力解释这一点。 假设列表中有多个项目: var products = new List<JObject>(); products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }")); products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }")); products.Add(JObje

我会尽力解释这一点。 假设列表中有多个项目:

var products = new List<JObject>();
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Yellows', importance: 200, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Blues', importance: 100, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 400, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Greys', importance: 120, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));
这可以用linq完成吗


如果没有like,可以这样做:

var variant = products[0].SelectToken("variant").ToString();
var productList = new List<JObject>();
var count = products.Count - 1;
for (var i = 0; i < count; i++)
{
    var product = products[i];
    var nextProduct = products[i + 1];
    var productVariant = nextProduct.SelectToken("variant").ToString();
    if (productVariant.Equals(variant)) continue;
    productList.Add(product);
    variant = productVariant;
}
productList.Add(products.Last());
var variant=products[0]。选择token(“variant”).ToString();
var productList=新列表();
var计数=产品。计数-1;
对于(变量i=0;i
所以,因为我使用的是
List()我必须创建一个匿名类型,然后进行分组。
我这样做:

var lastProducts = products
            .Select(m => new
            {
                Colour = m.SelectToken("colour").ToString(),
                Variant = m.SelectToken("variant").ToString(),
                Importance = Convert.ToInt32(m.SelectToken("importance").ToString())
            })
            .GroupBy(m => m.Variant)
            .Select(m => m.Last());

我相信这与我上面的方法相同。

您可以按
变量对
产品进行分组,然后选择每组中的最后一项:

var products = new List<JObject>();
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Yellows', importance: 200, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Blues', importance: 100, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 400, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Greys', importance: 120, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));

var query = from p in products
            group p by p.Property("variant").Value into varGroup
            select varGroup.Last();
var ans = products.GroupBy(p => p.Property("variant").Value).Select(pg => pg.Last()).ToList();
var产品=新列表();
Add(JObject.Parse(“{color:'Pinks',重要性:100,变量:'0'));
Add(JObject.Parse(“{color:'Blacks',重要性:200,变量:'0'}”);
Add(JObject.Parse(“{color:'Purples',重要性:150,变体:'0'}”);
Add(JObject.Parse(“{color:'Pinks',重要性:100,变体:'1'));
products.Add(JObject.Parse(“{color:'Yellows',重要性:200,变体:'1'}”);
products.Add(JObject.Parse(“{color:'Oranges',重要性:500,变体:'1'));
products.Add(JObject.Parse(“{color:'Blues',重要性:100,变体:'2'}”);
products.Add(JObject.Parse(“{color:'Pinks',重要性:400,变体:'2'));
Add(JObject.Parse({color:'Greys',重要性:120,变体:'2'));
Add(JObject.Parse(“{color:'Pinks',重要性:100,变体:'2'));
var query=来自产品中的p
按p属性(“变量”)将p分组。值放入VARGOUP
选择varGroup.Last();

您可以
GroupBy
使用“variant”属性并保留每个组的最后一个:

var products = new List<JObject>();
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Blacks', importance: 200, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Purples', importance: 150, variant: '0' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Yellows', importance: 200, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Oranges', importance: 500, variant: '1' }"));
products.Add(JObject.Parse("{ colour: 'Blues', importance: 100, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 400, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Greys', importance: 120, variant: '2' }"));
products.Add(JObject.Parse("{ colour: 'Pinks', importance: 100, variant: '2' }"));

var query = from p in products
            group p by p.Property("variant").Value into varGroup
            select varGroup.Last();
var ans = products.GroupBy(p => p.Property("variant").Value).Select(pg => pg.Last()).ToList();

如果您有实际的类来表示您的数据,这将非常简单。为什么不使用
产品
类?你能告诉我如何使用类吗?我将创建一个通用的
GroupBy()
Color,
OrderBy()
变量,然后使用
Last()
我用另一种方式来做:)不使用真正的类似乎很愚蠢,这只是额外的、不必要的工作。也许吧,但您不知道测试的上下文以及我为什么使用JObect。所有产品都有颜色、变体和重要性,但它们来自一个文档数据库,并具有许多其他特性。他们来我的申请的唯一原因是要对列表进行排序,产品需要返回相同的列,但由于我进行了排序,所以我误解了这个问题。我想您希望每种颜色都有最高的变体。为什么从
JObject
转换?这是最好的解决方案