开发者

C# LINQ Query

I have some data in a List of User defined types that contains the following data:

name, study, group, result, date. Now I want to obtain the name, study and group and then a calculation based onthe result and date. The calculation is effectively:

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

There are only two dates for each name/study/group, so the result from the maximum data (log) minus the result from the minumum date (log). here is what I have tried so far with no luck:

 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.Se开发者_开发知识库lect(c => c.volume)
                                  .Where(grp.Min(c => c.operationDate)))
    };

Anybody any pointers? Thanks.


It isn't entirely clear how the grouping relates to your problem (what sense does it make to extract a property from a range variable after it has been grouped?), but the part you're having difficult with can be solved easily with MaxBy and MinBy operators, such as the ones that come with 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)    
              };

Otherwise, you can simulate these operators with Aggregate, or if you don't mind the inefficiency of sorting:

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               
             };


You have a few syntax problems, you cannot use the results parameter after your into grp line. So my initial attempt would be to change your statement like so

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜