如何在 LINQ C# 中仅过滤 2 列分组中的最后一个值

Posted

技术标签:

【中文标题】如何在 LINQ C# 中仅过滤 2 列分组中的最后一个值【英文标题】:How to filter only last value in 2 columns grouping in LINQ C# 【发布时间】:2022-01-11 06:23:26 【问题描述】:

假设我有以下数据:

EntryID     |      ColValueText
1113                20
1113                19
1024                20
1113                20
1024                21
1113                23

所以在 C# 中使用 LINQ 或任何我想像这样过滤数据的方法

EntryID     |      ColValueText
1113               23
1024               21

即:按两列分组,但仅针对每个 entryid 获取 colvaluetext 的最后一个值。 我正在附加我的代码,但我无法根据 entryid 获取最后一个 colvaluetext。

var groupSalesPersonData = (from  r in sp
                                    group r by new  r.EntryID, r.ColValueText  
                                    into  results
                                    select new GroupByCommonDto
                                    
                                        ParentGroupById = results.Select(a => a.EntryID).LastOrDefault(),
                                        FieldValue = results.Select(a => a.FieldValue).LastOrDefault(),
                                        Order = results.Sum(x => x.Order),
                                        VehicleProfit = results.Sum(x => x.VehicleProfit),
                                        ColValueText = results.Select(a => a.ColValueText).LastOrDefault()
                                    )
                                    .ToList();

【问题讨论】:

您不应按ColValueText 分组,而应仅按EntryID 分组。无论如何,如果您解释为什么需要与ColValueText 分组会更好。以便评估是否需要。谢谢。 【参考方案1】:

我不会使用 Linq 来解决这个问题。您可以使用 Aggregate 执行此操作,因为这是一个聚合问题。我会使用一个简单的 foreach 和一个字典

【讨论】:

【参考方案2】:
var groupSalesPersonData = (from  r in sp
                                group r by new  r.EntryID 
                                into  results
                                select new GroupByCommonDto
                                
                                    ParentGroupById = results.Select(a => a.EntryID).LastOrDefault(),
                                    ColValueText = results.Select(a => a.ColValueText).LastOrDefault() //Assuming this is a text value and you always want last in the collection.
                                )
                                .ToList();

ColValueText 如果这是使用正确类型和正确排序顺序的数字,则始终为您提供正确的值

【讨论】:

以上是关于如何在 LINQ C# 中仅过滤 2 列分组中的最后一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# 中添加特定条件项后对特定元素进行分组 linq to sql

如何使用linq对数据表中的多个列进行分组? [复制]

C# LINQ 在列表中查找重复项

在 LINQ 中按特定列分组 [重复]

如何使用linq c#优化嵌套循环并从另一个列表中过滤

C# Winform DataTable 怎么过滤两列不重复