Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2012, 19:32   #1
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию LINQ. Как изменить данные одного из полей в коллекции?

Есть запрос в БД:

Код:
List<signal> signals = (from signal in DB.signals
                               where signal.system == system
                               orderby signal.dt_create descending
                               select signal).ToClientTime(h => h.dt_create).ToList();
Выделенный метод должен брать поле dt_create (типа DateTime) и изменять его, например добавлять минуты и возвращать обратно в коллекцию.

Мой вариант (не рабочий)

Код:
        public static IEnumerable<T> ToClientTime<T>(this IEnumerable<T> sourse,  Func<T,DateTime> func)
        {
            double offset = 200;

            foreach (T item in sourse)
            {
                func(item).AddMinutes(offset); // здесь должно быть присваивание
            }

            return sourse;
        }
Как видите это универсальный шаблон. Идея такая, что можно применить этот метод к любой коллекции где есть поле типа DateTime и менять его.

Просьба помочь или показать похожий пример.
kenji вне форума Ответить с цитированием
Старый 21.10.2012, 04:29   #2
GeorgeLucas
Пользователь
 
Аватар для GeorgeLucas
 
Регистрация: 20.10.2012
Сообщений: 11
По умолчанию

Зачем такие костыли? Этот код сложен, не удобен в поддержке и не будет работать.
GeorgeLucas вне форума Ответить с цитированием
Старый 21.10.2012, 10:48   #3
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от GeorgeLucas Посмотреть сообщение
Зачем такие костыли? Этот код сложен, не удобен в поддержке и не будет работать.
Для моей задачи очень удобен, так как у меня много таких таблиц, где нужно изменять поле DateTime. Писать методы для каждого типа это действительно костыли. А так взял коллекцию, указал поле и на выходе получил то что нужно.

Может есть более удобные варианты?
kenji вне форума Ответить с цитированием
Старый 21.10.2012, 10:53   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Вы по сути написали обыкновенный форыч, а функ этот лишний.
eval вне форума Ответить с цитированием
Старый 21.10.2012, 11:49   #5
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Вы по сути написали обыкновенный форыч, а функ этот лишний.
Я так понимаю функ даёт мне то самое поле DateTime, которое надо изменить. На вход он берёт универсальный тип T, а на выходе поле DateTime.

func(item).AddMinutes(offset); здесь я получаю поле и добавляю к нему минуты и теперь мне надо уже изменённый item поместить либо обратно в sourse, либо в новую коллекцию. В этом вся проблема
kenji вне форума Ответить с цитированием
Старый 21.10.2012, 11:55   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Никакое поле он вам не дает. Только данные которые в поле. Поэтому он и не нужен.
eval вне форума Ответить с цитированием
Старый 21.10.2012, 12:41   #7
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Никакое поле он вам не дает. Только данные которые в поле. Поэтому он и не нужен.
Тогда как мне изменить данные в поле?
kenji вне форума Ответить с цитированием
Старый 21.10.2012, 12:55   #8
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

ToClientTime(h => h.dt_create = h.dt_create.AddMinutes(offset)), только название поменять на удобоваримое.
eval вне форума Ответить с цитированием
Старый 21.10.2012, 13:09   #9
kenji
Пользователь
 
Регистрация: 28.10.2010
Сообщений: 22
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
ToClientTime(h => h.dt_create = h.dt_create.AddMinutes(offset)), только название поменять на удобоваримое.
В этом случае переменная offset выходит наружу. А так можно было бы её спрятать в методе расширения и не писать лишнего кода перед запросом.
kenji вне форума Ответить с цитированием
Старый 21.10.2012, 13:25   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Где тут лишний код?

Не хотите анонимный метод сделайте нормальный, я как то не понимаю в чем проблема у вас.
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как дописать данные из одного MemoryStream в другой? iiunbreakableii Общие вопросы Delphi 2 01.04.2011 08:17
Как данные из одного файла Excel сохранить в другой? Papiruzzz Microsoft Office Excel 3 17.01.2011 13:14
Как данные из полей ввода передать на другую страницу Arassir PHP 1 01.02.2010 22:42
как вставить данные из полей ввода в текст Arassir JavaScript, Ajax 2 20.01.2010 17:24
как раскидать сгруппированные данные из одного стобца по нескольким hudoi Microsoft Office Excel 2 07.02.2007 23:42