2013-05-10 2 views
0

Я хотел бы написать метод расширения в списке, который выполняет арифметическую операцию над элементом списка и предоставленным двойным, а затем записывает результат обратно в список. Пример:Метод расширения для списка, который выполняет арифметическую операцию в элементе списка

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() 

который будет возвращать сумму по всем пунктам между двумя датами. Теперь я хотел бы создать метод расширения, который принимает двойной и соответственно обновляет список. Например:

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()' after, например '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

Ударьте меня на это, я собирался добавить более общий ответ на мой ответ! –

Смежные вопросы