1

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.Select(c => c.volume) .Where(grp.Min(c => c.operationDate))) }; 

Anybody any pointers? Thanks.

1
  • can you provide an example of what the input XML looks like? Commented Apr 20, 2011 at 16:38

2 Answers 2

3

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 }; 
Sign up to request clarification or add additional context in comments.

Comments

1

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

1 Comment

I realised after I had typed it....had left in some mishmash of early attempts :) Thanks for the answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.