我有一个列表,其中包含每个订单的状态项。 我的问题是我需要删除所有状态的项目 - > logdate组合不是最高的。
e.g
var inputs = new List<StatusItem>();
//note that the 3th id is simply a modifier that adds that amount of secs
//to the current datetime, to make testing easier
inputs.Add(new StatusItem(123, 30, 1));
inputs.Add(new StatusItem(123, 40, 2));
inputs.Add(new StatusItem(123, 50, 3));
inputs.Add(new StatusItem(123, 40, 4));
inputs.Add(new StatusItem(123, 50, 5));
inputs.Add(new StatusItem(100, 20, 6));
inputs.Add(new StatusItem(100, 30, 7));
inputs.Add(new StatusItem(100, 20, 8));
inputs.Add(new StatusItem(100, 30, 9));
inputs.Add(new StatusItem(100, 40, 10));
inputs.Add(new StatusItem(100, 50, 11));
inputs.Add(new StatusItem(100, 40, 12));
var l = from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
;
编辑:为方便起见我也添加了类定义。
public class StatusItem
{
public int internalId;
public int statusId;
public DateTime date;
public StatusItem(int internalId, int statusId, int secMod)
{
this.internalId = internalId;
this.statusId = statusId;
date = DateTime.Now.AddSeconds(secMod);
}
}
这会创建一个列表,返回以下内容:
订单123状态30日期4/9/2010 6:44:21 PM
订单123状态40日期4/9/2010 6:44:24 PM
订单123状态50日期4/9/2010 6:44:25 PM
订单100状态20日期4/9/2010 6:44:28 PM
订单100状态30日期4/9/2010 6:44:29 PM
订单100状态40日期4/9/2010 6:44:32 PM
订单100状态50日期4/9/2010 6:44:31 PM
这几乎是正确的。但是,具有状态50的最后一行也需要被过滤掉,因为它被历史列表中的状态40否决了。你可以看出它的日期低于状态为40的“最后”状态项。
我希望有人可以给我一些指示,因为我卡住了。
编辑:最终完整解决方案:
var k = from sg in
from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
from s in sg
where s.date >= sg.Where(n => n.statusId <= s.statusId).Max(n => n.date)
group s by s.internalId
into si
from x in si
select x;
答案 0 :(得分:1)
您似乎目前没有执行日期所需的过滤操作,因此您需要对此进行一些操作。
副手,这样的事情会执行额外的过滤:
var k = from sg in l
from s in sg
where s.date >= sg.Where(n => n.statusId <= s.statusId).Max(n => n.date)
group s by s.internalId;
尚未对其进行测试,因此分组可能不是您想要的,并且比较可能会被颠倒,但类似的东西应该过滤。 >=
和<=
代替>
或<
应该意味着状态将始终与自身进行比较,而不必在总体问题中处理空集。
答案 1 :(得分:0)
它与您的形式不完全相同,但它确实给出了正确的结果。我用i,j和k属性创建了一个状态项类。不确定你用它们的名字。
var keys = inputs.Select(
input =>
new { i = input.i, j = input.j })
.Distinct();
var maxes = keys.Select(
ints =>
inputs.First(
input =>
input.i == ints.i
&& input.j == ints.j
&& input.k == inputs.Where(
i =>
i.i == ints.i
&& i.j == ints.j
).Select(i => i.k).Max()));