Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413

Компактная запись метода

24.02.2016, 09:49. Показов 2179. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Подскажите пожалуйста, как с помощью Linq более компактно и кратко записать сей метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 DateTime limit = DateTime.Now.AddMinutes((-1) * Properties.Settings.Default.minDeleteOlderRecords);
            if (!m_List.Any() == true)
            {
                this.m_List.AddRange(insert);
            }
            else
            {
                foreach (OktellChainCommutation ins in insert)
                {
                    foreach (OktellChainCommutation m in m_List)
                    {
                        if (ins.ChainId == m.ChainId)
                        {
                            //  ClientNumber 
                            //  CallTimeStart
                            m.CallTimeEnd = ins.CallTimeEnd;
                            // FirstNumber 
                            m.LastNumber = ins.LastNumber;
                            // CallTypeId 
                            // InputTime 
                            m.Commutation = ins.Commutation;
                        }
                        else
                        {
                            m.ClientNumber = ins.ClientNumber;
                            m.CallTimeStart = ins.CallTimeStart;
                            m.CallTimeEnd = ins.CallTimeEnd;
                            m.FirstNumber = ins.FirstNumber;
                            m.LastNumber = ins.LastNumber;
                            m.CallTypeId = ins.CallTypeId;
                            m.InputTime = ins.InputTime;
                            m.Commutation = ins.Commutation;
                        }
 
                    }
                }
            }
            this.m_List.RemoveAll(x => x.InputTime < limit);
Добавлено через 51 минуту
видимо форум еще не проснулся...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.02.2016, 09:49
Ответы с готовыми решениями:

Более компактная запись switch
Возник вопрос: можно ли в моём случае записать switch как-то более компактно и уложиться в меньшее количество строк? Фрагмент кода приложен...

Компактная запись массива структур
Можно ли записать массив структур более компактно, чем в приведённом ниже примере? И как это сделать? / control.cpp: определяет точку...

Компактная таблица
Добрый день! Посоветуйте пожалуйста какой-нибудь data grid или как сделать компактную таблицу. Стек html, css, js. Спасибо!

32
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
24.02.2016, 11:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Rius Посмотреть сообщение
Если любой из имеющихся свопадает с любым из добавляемых:
не то, нужно:
Если есть записи с одинаковым ChainId (ключевое поле)

Добавлено через 42 секунды
Цитата Сообщение от Alex_trader Посмотреть сообщение
ChainId (ключевое поле)
Уникальное поле
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
24.02.2016, 12:09
Цитата Сообщение от Alex_trader Посмотреть сообщение
не то, нужно:
Так это то же самое и есть.

Я правильно понимаю?
Есть два списка. Сохранённый и вставляемый.
Записи в сохранённом обновляются значениями идентичных (по ChainID) записей из вставляемых.
Остальные сохранённые удаляются. В список добавляются остальные вставляемые.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
24.02.2016, 12:12  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Я правильно понимаю?
Есть два списка. Сохранённый и вставляемый.
Записи в сохранённом обновляются значениями идентичных (по ChainID) записей из вставляемых.
Верно
Цитата Сообщение от Rius Посмотреть сообщение
Остальные сохранённые удаляются. В список добавляются остальные вставляемые.
Цитата Сообщение от Alex_trader Посмотреть сообщение
this.m_List.RemoveAll(x => x.InputTime < limit);
Удаляются, те записи у которых лимит времени закончился - старые они стали
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
24.02.2016, 12:14
Цитата Сообщение от Alex_trader Посмотреть сообщение
this.m_List.RemoveAll(x => x.InputTime < limit);
Удаляются, те записи у которых лимит времени закончился - старые они стали
Не касаясь этой строки.

Тогда так?

Есть два списка. Сохранённый и вставляемый.
Записи в сохранённом обновляются значениями идентичных (по ChainID) записей из вставляемых.
Несовпадающие записи остаются.
Новые добавляются.
Устаревшие удаляются.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
24.02.2016, 12:25  [ТС]
Примерно так, список insert обновляется каждые 30 секунд из БД
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
24.02.2016, 12:42
C#
1
2
3
4
5
6
7
8
9
10
11
// обновление
var list1 = m_List.Join(insert, o => o.ChainId, i => i.ChainId, (o, i) => new { Exists = o, Inserted = i });
foreach (var l in list1)
{
    l.Exists.FirstNumber = l.Inserted.FirstNumber;
}
// добавление новых
var list2 = insert.Except(this.m_List, new LambdaComparer<OktellChainCommutation>((x, y) => x.ChainId == y.ChainId));
this.m_List.AddRange(list2);
// удаление старых
this.m_List.RemoveAll(x => x.InputTime < limit);
Рассмотрите использование Dictionary с ключом по ChainID.

Добавлено через 43 секунды
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        private class LambdaComparer<T> : IEqualityComparer<T>
        {
            private readonly Func<T, T, bool> _lambdaComparer;
            private readonly Func<T, int> _lambdaHash;
 
            public LambdaComparer(Func<T, T, bool> lambdaComparer) :
                this(lambdaComparer, o => 0)
            {
            }
 
            public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
            {
                if (lambdaComparer == null)
                    throw new ArgumentNullException("lambdaComparer");
                if (lambdaHash == null)
                    throw new ArgumentNullException("lambdaHash");
 
                _lambdaComparer = lambdaComparer;
                _lambdaHash = lambdaHash;
            }
 
            public bool Equals(T x, T y)
            {
                return _lambdaComparer(x, y);
            }
 
            public int GetHashCode(T obj)
            {
                return _lambdaHash(obj);
            }
        }
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
24.02.2016, 12:59  [ТС]
Rius,
Цитата Сообщение от Rius Посмотреть сообщение
LambdaComparer<OktellChainCommutation>
студия ругается

Добавлено через 4 минуты
сложно читатьRius,
вот мой метод целиком
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 public void RegisterCallChainRange(IEnumerable<OktellChainCommutation> insert)
        {
 
            DateTime limit = DateTime.Now.AddMinutes((-1) * Properties.Settings.Default.minDeleteOlderRecords);
            if (!m_List.Any() == true)
            {
                this.m_List.AddRange(insert);
            }
            else
            {
                foreach (OktellChainCommutation ins in insert)
                {
                    foreach (OktellChainCommutation m in m_List)
                    {
                        if (ins.ChainId == m.ChainId)
                        {
                            m.CallTimeEnd = ins.CallTimeEnd;
                            m.LastNumber = ins.LastNumber;
                            m.Commutation = ins.Commutation;
                        }
                    }
                }
            }
            m_List = insert.ToList();
            this.m_List.RemoveAll(x => x.InputTime < limit);
        }


Добавлено через 1 минуту
Если только foreachи заменить на LINQ, это возможно?
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
24.02.2016, 13:01
foreach только обновляет. Вам ещё добавление нужно.
Студия ругается - код LambdaComparer<T> добавьте, что выше привёл.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
24.02.2016, 13:02  [ТС]
конечно 24 строка всё портит, но я её добавил, потому что с ней работает метод, но не совсем верно, иначе если список не пустой то обновятся некоторые данные, а новая свежая информация в лист не заходит
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
24.02.2016, 13:05
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 public void RegisterCallChainRange(IEnumerable<OktellChainCommutation> insert)
        {
            DateTime limit = DateTime.Now.AddMinutes((-1) * Properties.Settings.Default.minDeleteOlderRecords);
 
            // обновление
            var list1 = m_List.Join(insert, o => o.ChainId, i => i.ChainId, (o, i) => new { Exists = o, Inserted = i });
            foreach (var l in list1)
            {
                l.Exists.FirstNumber = l.Inserted.FirstNumber;
            }
 
            // добавление новых
            var list2 = insert.Except(this.m_List, new LambdaComparer<OktellChainCommutation>((x, y) => x.ChainId == y.ChainId));
            this.m_List.AddRange(list2);
 
            // удаление старых
            this.m_List.RemoveAll(x => x.InputTime < limit);
        }
 
        private class LambdaComparer<T> : IEqualityComparer<T>
        {
            private readonly Func<T, T, bool> _lambdaComparer;
            private readonly Func<T, int> _lambdaHash;
 
            public LambdaComparer(Func<T, T, bool> lambdaComparer) :
                this(lambdaComparer, o => 0)
            {
            }
 
            public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
            {
                if (lambdaComparer == null)
                    throw new ArgumentNullException("lambdaComparer");
                if (lambdaHash == null)
                    throw new ArgumentNullException("lambdaHash");
 
                _lambdaComparer = lambdaComparer;
                _lambdaHash = lambdaHash;
            }
 
            public bool Equals(T x, T y)
            {
                return _lambdaComparer(x, y);
            }
 
            public int GetHashCode(T obj)
            {
                return _lambdaHash(obj);
            }
        }
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
25.02.2016, 09:30  [ТС]
Rius, хотелось покомпактнее - получилось, что ещё один класс прирос))

Добавлено через 20 часов 5 минут
Цитата Сообщение от Alex_trader Посмотреть сообщение
Rius, хотелось покомпактнее - получилось, что ещё один класс прирос))
Всё сделал, получилось попроще, обошёлся без дополнительного класса
0
Эксперт .NET
 Аватар для Rius
13826 / 7898 / 1707
Регистрация: 25.05.2015
Сообщений: 23,972
Записей в блоге: 14
25.02.2016, 09:57
Alex_trader, поделитесь решением с последователями.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
25.02.2016, 09:59  [ТС]
Вот
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 public void RegisterCallChainRange(IEnumerable<OktellChainCommutation> insert)
        {
            
            DateTime limit = DateTime.Now.AddMinutes((-1) * Properties.Settings.Default.minDeleteOlderRecords);
 
            if (m_List.Any() == true)
            {
                // выборка: записи цепочек коммутаций, имеющихся в insert и m_List
                var list1 = m_List.Join(insert, o => o.ChainId, i => i.ChainId, (o, i) => new { Exists = o, Inserted = i });
                foreach (var l in list1)    // Обновляем записи в хранилище (m_List) новой информацией (insert)
                {
                    l.Exists.CallTimeEnd = l.Inserted.CallTimeEnd;
                    l.Exists.LastNumber = l.Inserted.LastNumber;
                    l.Exists.Commutation = l.Inserted.Commutation;
                }
 
                // выборка: записи из insert, отсутствующие в хранилище m_List
                insert = insert.Where(x => this.m_List.Any(y => y.ChainId == x.ChainId) == false);
            }
            // добавление новых
            this.m_List.AddRange(insert);
            // удаление старых
            this.m_List.RemoveAll(x => x.InputTime < limit);
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2016, 09:59

Компактная загрузка изображения
Пытаюсь написать код который будет загружать картинку на сайт не перезагружая страницу целиком. index.php ...

Компактная инициализация списка списков
Чтобы составить двумерный несимметричный массив из заранее известных объектов, делаю так: //основной список List&lt;MyObject&gt;...

Максимально компактная расшифровка байт ответа
Добрый день , может кто может предложить алгоритм расшифровки ? приходит байт ответа , его надо конвертировать в двоичку и вывести текстом...

Компактная жидкостная система охлаждения для шпинделя
Есть ЧПУ используемый в основном для сверления плат. На нем стоит шпиндель 300вт с жидкостным охлаждением Самый простой способ...

Краткая запись метода LINQ
Доброго времени суток, форумчане! Подскажите пожалуйста более компактную запись метода public IHttpActionResult...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru