1

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

这就是我正在寻找的。

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

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

K07000564, 
K07070000
K07069914
K07026318
K07019189

我想要的是按日期订购列表...但是在订购时,如果字符串值与其他日期一起出现在集合中,我想在此日期之后订购它们(按日期也在那个迷你 IdFinders 组中)...然后继续下单...

像这样的东西:

编辑

我编辑了示例以阐明按 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 中做到这一点。

也许一个重要说明我在 .NET 2.0 中,所以没有可用的 LINQ,但我正在使用Linqbridge来使用 Linq。

我试过这个,但你会注意到,这行不通

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

我希望已经清楚地解释了这一点

4

3 回答 3

5
var result = oList.OrderByDescending(x => x.OperationDate)
                  .GroupBy(x => x.IdFinder)
                  .SelectMany(x => x);
于 2012-12-28T19:07:16.943 回答
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 测试过它。

于 2012-12-28T19:11:25.663 回答
0

尝试这个

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

首先从IdFinder中提取数值,orderby这个值。

注意-> 假定i.IdFinder始终是有效的“K######”,其中 # 是小于Int32.MaxValue的数字。

于 2012-12-28T18:56:17.083 回答