2013-05-10 3 views
0

목록 항목과 제공된 double에 대해 산술 연산을 수행하는 목록에 확장 메서드를 작성한 다음 결과를 목록에 다시 씁니다. 예 :목록 항목에 산술 연산을 수행하는 목록의 확장 메서드

public class Datum 
{ 
    public DateTime DateTime; 
    public double Value; 
} 
public static class DateExt 
{ 
    public static double Average(this IEnumerable<Datum> @this) 
    { 
     return @this.Average(datum => datum.Value); 
    } 

    public static double Sum(this IEnumerable<Datum> @this) 
    { 
     return @this.Sum(datum => datum.Value); 
    } 


    public static IEnumerable<Datum> InTimeRange(this IEnumerable<Datum> @this, DateTime start, DateTime end) 
    { 
     return from datum in @this 
       where (start <= datum.DateTime && datum.DateTime < end) 
       select datum; 
    } 
} 

이 나에게 다음과 같은 작업을 수행 할 수 있습니다 : 두 날짜 사이의 모든 항목에 걸쳐 합계를 반환

return somelist.InTimeRange(startdate, enddate).Sum() 

. 이제 double을 취하여 그에 따라 목록을 업데이트하는 확장 메서드를 만들고 싶습니다. 예 :

return somelist.InTimeRange(startdate, enddate).Addition(double val) 

은 시작 날짜와 종료 날짜 사이에있는 목록의 각 항목에 val을 추가해야합니다. 나는 이것을 시도했다 :

public static double Addition(this IEnumerable<Datum> @this, double val) 
    { 
     return @this.(datum => datum.Value)+= val; 
    } 

그러나 이것은 효과가 없다.

목록 항목이 10이고 val = 5 인 경우 같은 위치에있는 업데이트 된 목록 항목은 의심의 여지가 없도록 15 일 것입니다.

모든 아이디어는 높이 평가됩니다.

감사합니다. 당신은 내가이 파괴적인 작업입니다 있으리라 믿고있어 컬렉션을 업데이트 말할

+2

가 작동하지 않는 이유는 무엇입니까? 오류 메시지 란 무엇이며 어떻게 작동하는지 알려 주어 잘못된 것이라고 생각하십니까? 그 외에 - 처음부터 코드가 틀린 것처럼 보입니다 -'@this. (datum ...)'무엇을 의미합니까? 어떤 방법이든 호출하지 마십시오 – Pako

+0

"작동하지 않는다"고 말하면됩니다. 당신이 기대하는대로하지 못하거나 예외를 던지거나 조용히 실패합니까? – Adrian

+0

식별자가 필요합니다. – nik

답변

2

가 아닌 파괴적인 버전 또는

public static IEnumerable<Datum> Addition(this IEnumerable<Datum> @this, double val) { 
    foreach (var datum in @this) { 
     datum.Value += val; 
    } 
    return @this; 
} 

(즉, 그것은 입력을 수정)

public static IEnumerable<Datum> Addition(this IEnumerable<Datum> @this, double val) { 
    return from datum in @this 
      select new Datum { 
       DateTime = datum.DateTime, 
       Value = datum.Value + val 
      }; 
} 
+0

그 또는 그는 누적을 돌려주고 싶습니다 (모든 것에 val을 추가했습니다). –

+0

@MatthewWatson 그러면'Sum()'을 사용하여 나중에 답할 수 있습니다. 예를 들어'list.Addition (5) .Sum() ' –

+0

감사합니다. 나는 그 일을한다고 생각한다. 긴 목록에서 여러 번해야하는 경우 이것이 성과 현명한 방법이라고 생각하십니까? 고맙습니다. – nik

0

방법에 대해 쓰기 일반 Action을 허용하는 일반 버전?

list.Do(d => d.Value += 1000); 

public static partial class Extensions 
{ 
    public static void Do<T>(this IEnumerable<T> e, Action<T> action) 
    { 
     foreach(var item in e) 
      action(item); 
    } 
} 
+0

저를 때려 눕히고 제 응답에 더 일반적인 솔루션을 추가하려고했습니다. –

관련 문제