Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223

Оптимизация кода, метод Contains

24.10.2018, 21:29. Показов 3608. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Допустим есть класс
C#
1
2
3
4
5
6
7
8
9
10
public class A
{
public int Id {get;set;}
public string Description {get;set;}
public A (int id, string description)
{
Id = id;
Description = description;
}
}
Есть коллекция экземпляров данного класса
C#
1
2
3
4
List<A> listA = new List<A>();
listA.Add(1, "A");
listA.Add(2, "B");
listA.Add(3, "С");
У меня есть значение Id, я хочу проверить - входит ли экземпляр с таким Id в указанную коллекцию.
Я делаю так:
C#
1
2
3
4
5
6
7
List<int> IDlist = new List<int>();
for (int i=0; i<listA.count; i++)
{
IDlist.Add(listA[i].Id);
}
 
if (IDlist.Contains(2)) {}
Может есть какой-то способ упростить этот код? Не создавать вспомогательную коллекцию List<int> IDlist?

Добавлено через 2 минуты
Реальный пример чуть сложнее, хочу понять принцип.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2018, 21:29
Ответы с готовыми решениями:

Оптимизация кода
Здравствуйте. Имею такую задачу: проходиться по коллекции файлов, и проводить фильтр по определённым условиям. Причём условия формируются...

Оптимизация кода
Есть кусок кода: public static void NOCH (object source, ElapsedEventArgs e) { try { ...

Оптимизация кода
Помогите пожалуйста get-ер оптимизировать. Уже оптимизировал как мог для максимально быстрого получения обьекта, но все ровно не достаточно...

26
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
24.10.2018, 21:40
Это как ?
C#
1
2
List<A> listA = new List<A>();
listA.Add(1, "A");
Может всё-таки:
C#
1
listA.Add(new A(1, "A"));
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
24.10.2018, 21:40
C#
1
2
3
            List<A> listA = new List<A>();
            int id = 2;
            var a = listA.FirstOrDefault(obj => obj.Id == id);
Если есть с таким id то в переменной a будет ссылка на него, если нет - null.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 21:42  [ТС]
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Может всё-таки:
C#Выделить код
1
listA.Add(new A(1, "A"));
Да, конечно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
24.10.2018, 21:42
Цитата Сообщение от wrq2017 Посмотреть сообщение
Есть коллекция экземпляров данного класса
C#
1
2
3
4
List<A> listA = new List<A>();
listA.Add(1, "A");
listA.Add(2, "B");
listA.Add(3, "С");
И здесь конечно ошибка. Вы не в студии писали?
Надо как написал PoPsa85.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.10.2018, 21:49
Цитата Сообщение от wrq2017 Посмотреть сообщение
Может есть какой-то способ упростить этот код? Не создавать вспомогательную коллекцию List<int> IDlist?
А действительно, зачем вы ее создаете?
Если можно просто

C#
1
2
3
4
5
6
for (int i=0; i<listA.count; i++)
if (listA[i].Id == 2)
{
    //....
    break;
};
0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 21:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
List<A> listA = new List<A>();
* * * * * * int id = 2;
* * * * * * var a = listA.FirstOrDefault(obj => obj.Id == id);
Уточняю свой вопрос.
Есть второй класс, такой что
C#
1
2
3
4
public B
{
  public A A {get;set;}
}
Есть коллекция экземпляров класса А - listA, которая играет роль ограничителя, а есть коллекция экземпляров класса B, которую мы должны фильтровать по listA.
И я делаю так:
C#
1
2
3
4
5
6
7
List<int> IDlist = new List<int>();
for (int i=0; i<listA.count; i++)
{
IDlist.Add(listA[i].Id);
}
 
listB = listB.Where(x => IDlist.Contains(x.A.Id)).ToList();
Вот так правильно. Как здесь уйти от массива IDlist? Есть ли какой-нибудь синтаксический сахарок здесь ?

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И здесь конечно ошибка. Вы не в студии писали?
Надо как написал PoPsa85.
Нет, прямо на форуме.
0
 Аватар для PoPsa85
814 / 561 / 240
Регистрация: 01.07.2018
Сообщений: 1,818
24.10.2018, 21:54
Ну и свой вариант предложу:
C#
1
2
foreach (var item in listA)
if (item.Id == 2) Console.WriteLine(item.Id + "|" + item.Description);
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.10.2018, 21:55
Цитата Сообщение от wrq2017 Посмотреть сообщение
Есть ли какой-нибудь синтаксический сахарок здесь
Так вы уж определитесь, вам синтаксический сахарок, или оптимизация? Потому что это обычно вместе не подают.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 21:57  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Есть ли какой-нибудь синтаксический сахарок здесь
Так вы уж определитесь, вам синтаксический сахарок, или оптимизация? Потому что это обычно вместе не подают.
Под оптимизацией я здесь понимаю не производительность, а сокращение объема кода. Поэтому понимаю, что быть может есть вариант написать тоже самое короче, но не обязательно оно будет работать быстрее...
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.10.2018, 22:00
Лучший ответ Сообщение было отмечено wrq2017 как решение

Решение

Цитата Сообщение от wrq2017 Посмотреть сообщение
Под оптимизацией я здесь понимаю не производительность, а сокращение объема кода. Поэтому понимаю, что быть может есть вариант написать тоже самое короче, но не обязательно оно будет работать быстрее...
Ну тогда очевидно же:
C#
1
listB = listB.Where(x => listA.Any(a => a.Id == x.A.id)).ToList();
ЗЫ
Только производительность тут O(n^2), ну то таке, по нынешним временам сойдет...
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 22:08  [ТС]
Storm23, спасибо!!! Именно то, что я и хотел. А мой исходный вариант по производительности будет (должен быть) быстрее?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.10.2018, 22:11
Цитата Сообщение от wrq2017 Посмотреть сообщение
А мой исходный вариант по производительности будет (должен быть) быстрее?
Именно ваш вариант - нет, не быстрее.
Но если бы у вас вместо List<int> было бы HashSet<int>, то скорость возрасла бы до O(n).
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 22:17  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Именно ваш вариант - нет, не быстрее.
Но если бы у вас вместо List<int> было бы HashSet<int>, то скорость возрасла бы до O(n).
Спасибо! Коллекции-ограничители не превышают сотни элементов, поэтому я думаю конечное время не будет значительно отличаться по обоим вариантам.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
24.10.2018, 22:19
Цитата Сообщение от wrq2017 Посмотреть сообщение
поэтому я думаю конечное время не будет значительно отличаться по обоим вариантам.
Все так думают.... поначалу.
1
24.10.2018, 22:20

Не по теме:

Цитата Сообщение от Storm23 Посмотреть сообщение
по нынешним временам сойдет...
Мой тимлид вздрагивает когда такое слышим :)

0
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
24.10.2018, 22:47  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Все так думают.... поначалу.
Ок Перехожу на хэшсеты!
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
24.10.2018, 23:32

Не по теме:

Цитата Сообщение от wrq2017 Посмотреть сообщение
Ок Перехожу на хэшсеты!
Известно, в мире все лишь суета сует:
Будь весел, не горюй, стоит на этом свет.

0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.10.2018, 00:40
wrq2017, пиши так.
C#
1
2
            ICollection<int> condition = listA.Select(x=>x.Id).ToHashSet();
            List<A> matched = listB.Where(x=>condition.Contains(x.Id)).ToList();
Ну, или так:
C#
1
   List<A> matched = listB.Intersect(listA, (x,y)=>x.Id==y.Id).ToList();
Добавлено через 3 минуты
wrq2017, хм, а 100 раз для тебя мало?
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
27.10.2018, 00:12  [ТС]
Цитата Сообщение от New man Посмотреть сообщение
wrq2017, хм, а 100 раз для тебя мало?
Ну если каждая итерация происходит за какие-то наносекунды , то да Да и большую часть времени в моем случае будет съедать запрос к БД. Если пользователь нажимает кнопку "Получить данные из БД", он же может подождать <1 мин. Ничего же с ним не произойдет Тем более, если это время - рабочее

Добавлено через 2 минуты
Цитата Сообщение от New man Посмотреть сообщение
ICollection<int> condition = listA.Select(x=>x.Id).ToHashSet();
* * * * * * List<A> matched = listB.Where(x=>condition.Contains(x.Id)) .ToList();
Точнее так?:
C#
1
2
ICollection<int> condition = listA.Select(x=>x.Id).ToHashSet();
* * * * * * List<B> matched = listB.Where(x=>condition.Contains(x.A.Id)).ToList();
Добавлено через 5 часов 18 минут
Цитата Сообщение от New man Посмотреть сообщение
listA.Select(x=>x.Id).ToHashSet();
А у меня такого нет... Из коллекции через селект получить хэш-сет. Что-то надо подключить?

Добавлено через 8 минут
А, вижу... Доступно с версии 4.7.2. Надо обновляться
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2018, 00:12
Помогаю со студенческими работами здесь

Оптимизация кода
Консольное приложение. Писалось на VS 2010 с использованием .NET Framework 4. Вроде более-менее оптимизировал, но все равно генерация...

Оптимизация кода
Есть такая статья http://habrahabr.ru/post/165729/. Но в ней перечислена лишь малая часть возможных оптмизаций. Где можно посомтреть все...

Оптимизация кода
Можно ли это как то оптимизировать? public void Vn_Method(int a,ref Button btn1, ref Button btn2, ref Button btn3, ref Button btn4) ...

Оптимизация кода
Доброго времени суток. Прошу прощения, если буду ошибаться в терминах, но постараюсь правильно разъяснить проблему. Пишу приложение...

Оптимизация кода в C#
Подскажите книгу пожалуйста,по оптимизации кодов C# если такие имеют место быть!!! Пишу избыточные коды ((( хотелось бы писать более...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru