Tag: row number

组内的LINQ到对象索引+用于不同的分组(也称为ROW_NUMBER与PARTITION BY等效)

经过大量的Google搜索和代码实验,我对一个复杂的C#LINQ-to-objects问题感到难过,在SQL中使用一对ROW_NUMBER()… PARTITION BY函数和一个或两个子查询很容易解决这个问题。 用语言来说,这就是我在代码中尝试做的事情 – 基本要求是从列表中删除重复的文档: 首先,按(Document.Title,Document.SourceId)对列表进行分组,假设(简化)类定义如下: class Document { 字符串标题; int SourceId; //来源优先(ID = 1比ID = 2好) } 在该组中,为每个文档分配一个索引(例如,索引0 = =第一个文档,此标题来自此来源,索引1 =第二个文档,此标题来自此来源,等等)。 我喜欢SQL中相当于ROW_NUMBER()的东西! 现在分组(Document.Title,Index),其中Index在步骤#2中计算。 对于每个组,只返回一个文档:Document.SourceId最低的文档。 步骤#1很简单(例如codepronet.blogspot.com/2009/01/group-by-in-linq.html),但我对步骤#2和#3感到困惑。 我似乎无法构建一个红色无波形的C#LINQ查询来解决所有这三个步骤。 Anders Heilsberg关于这个post的post是我认为如果我能正确理解语法,那么上面的步骤#2和#3的答案。 我倾向于避免使用外部局部变量来执行索引计算,正如slodge.blogspot.com/2009/01/adding-row-number-using-linq-to-objects.html所建议的那样,因为该解决方案中断了如果外部变量被修改。 最佳地,可以首先完成逐个标题步骤,因此“内部”分组(首先由Source计算索引,然后通过索引来过滤掉重复项)可以对每个“按标题”中的少量对象进行操作group,因为每个by-title组中的文档数量通常都在100以下。我真的不想要N 2解决方案! 我当然可以用嵌套的foreach循环解决这个问题,但看起来像LINQ这个问题应该很简单。 有任何想法吗?