我有这样的数据 .
原始数据:
1 - > A - > 1 - > 2011 - > 2009
2 - > A - > 1 - > 2011 - > 2010
3 - > B - > 1 - > 2008 - > 2008
4 - > B - > 1 - > 2009 - > 2009
5 - > A - > 2 - > 2008 - > 2009
6 - > B - > 1 - > 2008 - > 2011
第1步:按列2分区 .
1 - > A - > 1 - > 2011 - > 2009
2 - > A - > 1 - > 2011 - > 2010
5 - > A - > 2 - > 2008 - > 2009
3 - > B - > 1 - > 2008 - > 2008
4 - > B - > 1 - > 2009 - > 2009
6 - > B - > 1 - > 2008 - > 2011
步骤2:按列3(降序)应用排序,如果在第一个位置找到唯一记录则返回该结果,否则仅在模糊记录上应用下一个排序标准,即重复步骤#2 .
5 - > A - > 2 - > 2008 - > 2009 //Unique Record
1 - > A - > 1 - > 2011 - > 2009
2 - > A - > 1 - > 2011 - > 2010
3 - > B - > 1 - > 2008 - > 2008
4 - > B - > 1 - > 2009 - > 2009
6 - > B - > 1 - > 2008 - > 2011
所以现在我们的结果将是这样的 . 清单1:
5 - > A - > 2 - > 2008 - > 2009
清单2:由于我们已经能够在"A"中找到唯一记录,因此从剩余列表中删除其数据
3 - > B - > 1 - > 2008 - > 2008
4 - > B - > 1 - > 2009 - > 2009
6 - > B - > 1 - > 2008 - > 2011
步骤3:应用下一个排序标准,即column4(降序),但位置1的数据不明确
3 - > B - > 1 - > 2008 - > 2008
6 - > B - > 1 - > 2008 - > 2011
4 - > B - > 1 - > 2009 - > 2009
步骤4:仅对模糊结果应用下一个排序标准,即column5(降序)
6 - > B - > 1 - > 2008 - > 2011 //Unique record
3 - > B - > 1 - > 2008 - > 2008
所以最终列表将包含如下结果 .
5 - > A - > 2 - > 2008 - > 2009
6 - > B - > 1 - > 2008 - > 2011
所以我希望在应用每个排序标准后从结果中获取唯一数据 . 我不知道我能否以更好的方式解释我的问题,我知道通过使用for循环和比较数据我可以解决它但只需要帮助解决它最好的方法 .
3 回答
对我来说,最好的方法,就是涉及最少量循环的方法就是这样:
第2列需要一个LINQ组(第1步:第2列分区)
这将为您提供两个组的匿名列表,其中包含组[0]中A的所有元素和组[1]中B的元素 .
因此,您需要循环遍历组数组,并在第3列应用排序之后获取第一个元素,然后按列4降序,然后按列5降序 . 此处的重要部分是ThenBy .
所以它基本归结为:
如果您需要正确的语法,请告诉我 .
我创建了一个类似下面的类来表示您的数据
然后我写了这个程序,似乎在某个你正在寻找的东西
它适用于'A'分区,对于'B'没有,但是你的解释中有一些东西似乎不正确:当你在文本中描述第3步时,你要求第4列有序下降,但在数据中,你把它们命令为升序 . 所以,我按照你写的文字,如果你想升序,你只需要我的代码,删除orderby子句中的“降序”,自动Linq将命令提到的字段升序 . 我希望它有所帮助!
您可以使用linq:
首先我组(你称之为partision),然后我根据你的需要,使它成为动态并得到第一个记录 .