我无法更好地表达我在标题中提出的要求。
这就是我正在寻找的。 p>
我有一个特定对象的无序列表我有DateTime
和String
属性。
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);
我希望能够清楚地解释这个
答案 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中提取数值,按此值排序。
注意 - >假设i.IdFinder
始终是有效的“K ######”,其中#的数字小于Int32.MaxValue。