2011-04-20 149 views
1

我在包含以下数据的用户定义类型列表中有一些数据:C#LINQ查询

名称,研究,组,结果,日期。现在我想获得姓名,学习和分组,然后根据结果和日期进行计算。计算是有效的:

log(result).where max(date) minus log(result).where min(date) 

有每个名称/学习/组只有两个日期,所以从最大数据(日志)减去的最少日的结果的结果(日志)。这里是我迄今为止没有运气试过的东西:

var result = 
    from results in sortedData.AsEnumerable() 
    group results by results.animal 
    into grp 
    select new 
    { 
     animal = results.animal, 
     study = results.study, 
     groupNumber = results.groupNumber, 
     TGI = System.Math.Log(grp.Select(c => c.volume) 
            .Where(grp.Max(c=>c.operationDate))) 
      - System.Math.Log(grp.Select(c => c.volume) 
            .Where(grp.Min(c => c.operationDate))) 
    }; 

有人有指点吗?谢谢。

+0

你能提供一个输入XML的例子吗? – 2011-04-20 16:38:23

回答

3

这是不完全清楚的分组如何涉及到你的问题(它是如何从范围变量中提取一个属性后它已被分组?),但你有困难的部分与可以用MaxByMinBy运营商轻松解决,比如morelinq

var result = from results in sortedData.AsEnumerable() 
      group results by results.animal into grp 
      select new 
      { 
       animal = grp.Key, 
       study = ??, 
       groupNumber = ??, 
       TGI = Math.Log(grp.MaxBy(c => c.operationDate).volume) 
         - Math.Log(grp.MinBy(c => c.operationDate).volume)  
       }; 

否则,您可以模拟这些运营商Aggregate,或者如果你不介意的排序效率低下:

var result = from results in sortedData.AsEnumerable() 
      group results by results.animal into grp 

      let sortedGrp = grp.OrderBy(c => c.operationDate) 
           .ToList() 
      select new 
      { 
       animal = grp.Key, 
       study = ??, 
       groupNumber = ??, 
       TGI = sortedGrp.Last().volume - sortedGrp.First().volume    
      }; 
+0

MaxBy方法为+1 – mBotros 2011-04-20 16:46:35

+0

MaxBy方法完美地工作。谢谢。 – 2011-04-20 17:23:35

1

你有几个语法问题,你不能使用结果参数后你的分为grp一行。所以我最初的尝试是改变你的陈述,就像这样

var result = 
    from results in sortedData.AsEnumerable() 
    group results by new 
    { 
    Animal = results.animal, 
    Study = results.study, 
    GroupNumber = results.groupNumber 
    } 
    into grp 
    select new 
    { 
     animal = grp.Key.Animal, 
     study = grp.Key.Study, 
     groupNumber = grp.Key.GroupNumber, 
     TGI = System.Math.Log(grp.OrderByDescending(c=>c.operationDate).First().volume) 

      - System.Math.Log(grp.OrderBy(c=>c.operationDate).First().volume) 
    }; 
+0

我意识到我输入了它之后......已经留下了一些早期尝试的混杂:)谢谢你的答案。 – 2011-04-20 17:24:06