按日期排序列表<t>,但它有一个字符串ID,如果该ID在集合中以不同的日期重复,则应显示在其下方</t>

时间:2012-12-28 18:53:31

标签: c# asp.net .net linq linqbridge

我无法更好地表达我在标题中提出的要求。

这就是我正在寻找的。

我有一个特定对象的无序列表我有DateTimeString属性。

String属性有这样的值(注意它是一个字符串,而不是一个数字,它总是有K字母,我应该只用数字排序):

K07000564, 
K07070000
K07069914
K07026318
K07019189

我想要的是订购List By Date ...但是在订购时如果String值存在于其他Date的集合中我想在它之后订购它们(在IdFinders的那个miniGroup中按日期排序) ......然后继续订购...

像这样:

修改

我编辑了这个例子,以澄清IdFinder的排序不起作用......我需要按日期排序..如果按日期排序,IdFinder在集合中出现多次,应该在最后一个之后显示,然后按每个idfinder继续订购其余的等等

ID         Date
**K07000564**   Today
K07000562   Yesterday
K07000563   The Day Before Yesterday
**K07000564** The day before the day before yesterday

应该是

K07000564 Today
K07000564 The day before the day before yesterday
K07000562 Yesterday 
K07000563  The Day Before Yesterday 

我之前在一个项目中在SQL Server 2008中实现了这个目标:

WITH B
AS
(
    SELECT 
        ID, 
        MAX(DATE_COLUMN) DATE_COLUMN, 
        ROW_NUMBER() OVER (ORDER BY MAX(DATE_COLUMN) DESC) RN
    FROM MYTABLE
    GROUP BY ID

)

SELECT *
FROM MYTABLE c
, B
WHERE ID= b.ID
ORDER BY b.rn, c.DATE_COLUMN desc;

但我对Linq并不擅长,而且我不知道Linq是如何做到这一点的。

也许是一个重要的注意事项我在.Nt 2.0,所以没有LINQ可用,但我使用Linqbridge来使用Linq。

我尝试了这个,但正如您将注意到的那样,这将不起作用

oList.OrderBy(i => i.IdFinder).ThenByDescending(i => i.OperationDate);

我希望能够清楚地解释这个

3 个答案:

答案 0 :(得分:5)

var result = oList.OrderByDescending(x => x.OperationDate)
                  .GroupBy(x => x.IdFinder)
                  .SelectMany(x => x);

答案 1 :(得分:2)

我认为这应该可以解决问题:

var sortedList = oList
    .GroupBy(x => x.IdFinder)
    .Select(g =>
        new
            {
                MaxOpDate = g.Max(x => x.OperationDate),
                Items = g
            })
    .OrderByDescending(g => g.MaxOpDate)
    .SelectMany(g => g.Items.OrderByDescending(x => x.OperationDate));

但是,我还没有使用Linqbridge进行测试。

答案 2 :(得分:0)

试试这个

oList.OrderBy(i => int.parse(i.IdFinder.Substring(1,i.IdFinder.Length-1)).ThenByDescending(i => i.OperationDate);

首先从IdFinder中提取数值,按此值排序。

注意 - &gt;假设i.IdFinder始终是有效的“K ######”,其中#的数字小于Int32.MaxValue