2009-09-22 5 views
3

LINQ를 처음 사용하고 새로운 방법으로 내 머리를 감싸려고하는 경우. 내가 할 시도하고있는 무슨 :LINQ에서 개체로 확장 메서드를 구현하는 방법에 대해 혼동을 느낀 경우

1) 세 개의 열, COL1 (문자열), COL2 (더블), COL3 (날짜 시간)

 table1.Rows.Add("string 1", 1, new DateTime(2009, 01, 01)); 
     table1.Rows.Add("string 1", 2, new DateTime(2009, 02, 01)); 
     table1.Rows.Add("string 1",3, new DateTime(2009, 03, 01)); 
     table1.Rows.Add("string 1", 4, new DateTime(2009, 04, 01)); 
     table1.Rows.Add("string 2",1, new DateTime(2009, 05, 01)); 
     table1.Rows.Add("string 2", 1, new DateTime(2009, 06, 01)); 
     table1.Rows.Add("string 2", 5, new DateTime(2009, 07, 01)); 
     table1.Rows.Add("string 3", 6, new DateTime(2009, 08, 01)); 

2)와 테이블이 나는 LINQ를 작성해야 쿼리를 열 1별로 그룹화하고 그룹화 된 행을 값 double을 반환하는 메서드로 보냅니다. 이

var query = from t in table1 
      group t by t.col1 into g 
      select new { r1 = g.Key, r2=mycalc(g)) 

3 비슷해) 및 확장 기능이 있습니다

public static double Median(this IEnumerable<DataSet1.DataTable1Row> source) 
{ 
    //calc using the grouped row data and return a dobule 
} 

내가 조금이에 일한지를 꽤 그것을 얻을하지 않습니다. 누군가 제발 도와 줄 수 있니?

답변

3

글쎄, 어느 비트가 문제의 원인인지는 분명하지 않습니다.

var query = from t in table1 
      group t by t.col1 into g 
      select new { r1 = g.Key, r2=g.Median() }; 

당신에게 문제를 일으키는 Median 비트가 : 이미 Median 방법을 수행 한 경우에, 당신은 query에 변경할 수 있습니까? 아마 쉬운이 그런 짓을하는 것 :

public static double Median(this IEnumerable<DataSet1.DataTable1Row> source) 
{ 
    List<double> values = source.Select(x => x.col2).ToList(); 
    values.Sort(); 
    if ((values.Count % 2) == 1) // Odd number of values 
    { 
     return values[values.Count/2]; 
    } 
    else // Even number of values: find mean of middle two 
    { 
     return (values[values.Count/2] + values[values.Count/2 + 1])/2; 
    } 
} 

이 그 일을 더 효율적인 방법이 될 수 있습니다,하지만 난 ...

그들을 모른다
관련 문제