C# LINQ中的分组问题

C# LINQ中的分组问题,c#,linq,C#,Linq,我有一些类似的结构列表: struct va_data { public int item_id; public int type_id; public double item_value; public DateTime value_date; } from data in dataList group data by new {data.item_id, data.type_id} into g let max_value_date = g.Max(x => x.va

我有一些类似的结构列表:

struct va_data
{
  public int item_id;
  public int type_id;
  public double item_value;
  public DateTime value_date;
}
from data in dataList
group data by new {data.item_id, data.type_id} into g
let max_value_date = g.Max(x => x.value_date)
from i in g.Where(x => x.value_date == max_value_date)
group i by i.item_id into g2
let min_item_value = g2.Min(x => x.item_value)
from x in g2
where x.item_value == min_item_value
select x;
我尝试按类型\u id对列表进行分组,并在值\u date最大的位置获取项目,然后按项目\u id进行分组,仅在项目\u值最小的位置获取项目

这是我的语法

from x in dataList 
group x by x.type_id into grouped 
select grouped.Where(x => x.value_date == grouped.Max(y => y.value_date))
    .GroupBy(x => x.item_id) // and here i was stuck.


Example

var dataList = new []
{
   new va_data {item_id = 1, type_id = 1, item_value = 0, value_date = "2013.07.29"},
   new va_data {item_id = 1, type_id = 1, item_value = 1, value_date = "2013.07.30"},
   new va_data {item_id = 2, type_id = 1, item_value = 0, value_date = "2013.07.29"},
   new va_data {item_id = 2, type_id = 1, item_value = 1, value_date = "2013.07.29"},
   new va_data {item_id = 4, type_id = 2, item_value = 5, value_date = "2013.07.29"},
   new va_data {item_id = 4, type_id = 3, item_value = 9, value_date = "2013.07.30"},
};

The result must be 

var dataListResult = new []
{
   new va_data {item_id = 1, type_id = 1, item_value = 1, value_date = "2013.07.30"},
   new va_data {item_id = 2, type_id = 1, item_value = 0, value_date = "2013.07.29"},
   new va_data {item_id = 4, type_id = 2, item_value = 5, value_date = "2013.07.29"},
}

给定以下类

class va_data
{
  public int item_id;
  public int type_id;
  public double item_value;
  public DateTime value_date;
}
对于示例数据,您可以使用如下查询:

struct va_data
{
  public int item_id;
  public int type_id;
  public double item_value;
  public DateTime value_date;
}
from data in dataList
group data by new {data.item_id, data.type_id} into g
let max_value_date = g.Max(x => x.value_date)
from i in g.Where(x => x.value_date == max_value_date)
group i by i.item_id into g2
let min_item_value = g2.Min(x => x.item_value)
from x in g2
where x.item_value == min_item_value
select x;
要获得以下结果:


只需将查询分为两部分-获取每种类型的最新信息,然后获取每项的最小信息:

var latestOfEachType = 
             from d in dataList
             group d by d.type_id into typeGroup
             select typeGroup.OrderByDescending(x => x.value_date).First();

var result = from d in latestOfEachType
             group d by d.item_id into itemGroup
             select itemGroup.OrderBy(x => x.item_value).First();
此查询将作为单个查询执行。但在这种情况下,我觉得它更具可读性。也。改用类


编辑:因此您有多个项目用于max date,然后查询需要两个小调整-选择date为max的所有项目,并使用SelectMany对其进行迭代:

var latestOfEachType =
             from d in dataList
             group d by d.type_id into typeGroup
             let maxDate = typeGroup.Max(x => x.value_date)
             select typeGroup.Where(x => x.value_date == maxDate);

var result = from d in latestOfEachType.SelectMany(g => g)
             group d by d.item_id into itemGroup
             select itemGroup.OrderBy(x => x.item_value).First();

你能举一个预期结果的例子吗?(还有什么输入。)看起来你就快到了。看起来您只需
选择
,其中
项的值等于组的最小值。有一件事可能会让您感到困惑,那就是您正在为linq切换两种不同的符号。(从扩展表示法到点表示法。(这是个人偏好,我更喜欢点))linq的一点是,因为所有东西都可以“链”起来,你可以将结果保存到一个变量中,以便“重新开始”,如果它更容易理解的话。祝你好运这就是重点。我不能简单地选择item_value为最小值的项目,因为我的项目仍然是一组项目,所以我很困惑。您的示例不符合您的描述:按类型_id对列表进行分组,并选择value_date为最大值的项目这会过滤掉类型_id==1的所有项目,但value_date==“2013.07.30”(“2013.07.30”为最大值)的项目除外,但在您的示例中,您说您需要两个类型为\u id==1的项目,一个是
value\u date=“2013.07.30”
,另一个是
value\u date=“2013.07.29”
有一件事。LatestToFeachType将只包含一个类型为_idgroup的项,但在我的情况下,值_date等于许多项,首先我需要获取所有项,然后获取唯一项_id列表,其中项_值为minimum@user2629487因此,在每个类型组中都有几个项目具有最大日期,您想全部选择它们吗?是的。第一步是将它们全部选中,然后按最小项从每组中仅获取一项_value@user2629487好的,根据我现在的理解,更新了查询以满足您的需要:)看起来很棒,但我想知道,我可以通过此语法获得简单列表吗?@user2629487
var result=over\u query.SelectMany(t=>t.items.SelectMany(I=>I.items)).ToList()
此查询似乎正在丢失数据var count1=dataList.Where(x=>x.item_id==7643).Count();//8 var query=(从数据列表组x中的x按x.type_id进入g,让max_value_date=g.max(x=>x.value_date)选择新的{items=g.Where(x=>x.value_date==max_value_date)});var count2=query.SelectMany(t=>t.items)。其中(x=>x.item_id==7643)。Count();//0@user2629487这些项目被适当地过滤掉,因为它们属于
类型\u id
-组,其中
值\u日期
不是最大值。没有输入/输出示例很难说。在这里,我制作了一个示例