Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538

Снова сравниваю списки

01.07.2013, 03:52. Показов 752. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Была тема:Сравнить 2 листа
Остановились на
C#
1
2
3
4
                foreach (string str in tempColl.Except(coll).ToList())
                    coll.Add(str);
                foreach (string str in coll.Except(tempColl).ToList())
                    coll.Remove(str);
Но пару дней назад мне в голову забрела мысль сделать не string а класс из 3-х string. Для сравнения сделал такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                for (int i = 0; i < coll.Count; i++)
                {
                    for (int j = 0; j < tempColl.Count; j++)
                    {
                        if (coll[i].Name == tempColl[j].Name)
                        {
                            coll[i] = tempColl[j];
                        }
                    }
                }
                sw.Start();
                foreach (Person str in tempColl.Except(coll).ToList())
                    coll.Add(str);
                foreach (Person str in coll.Except(tempColl).ToList())
                    coll.Remove(str);
Ненравится то, что 2 for'а ужасно замедляют процесс. Пробовал переписать Equals класса, чтобы проверялось только Name и при нахождении совпадений менять 2 оставшихся string'а, но при этом коллекция не реагирует на изменение и считает что никто ничего не менял.

Добавлено через 4 минуты
C#
1
coll[i] = tempColl[j]
заменил на:
C#
1
2
coll[i].Ping = tempColl[j].Ping;
coll[i].Score = tempColl[j].Score;
Скорость стала нормальной, но нет ли способа сделать всё без извращений?(

Добавлено через 1 час 3 минуты
Ужс какой-то, он так не считает их равными... Сделал override Equals, возвращает тру если все значения одинаковые, ищется всё правильно, а сигнал гриду о изменении значений не идёт. Я так чувствую ещё день с этим повожусь такими темпами, забью на всю эту гадость и верну полный Items.Clear(); ;(

Добавлено через 43 секунды
ПыСы, а зачем при добавлении нового элемента в коллекцию вызывается GetHashCode?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2013, 03:52
Ответы с готовыми решениями:

Правильно ли сравниваю строки?
Приведу примеры, укажите какой вариант правильный или возможно другие конструкции использовать нужно для простых сравнений: string...

Снова списки.
Здравствуйте!!! Мне нужно сделать функцию, которая проверяет..если есть левая скобка и парная ей правая, то их обе нужно заменить на...

Снова зависимые списки
Здравствуйте, форумчане. подскажите как реализовать: есть два связанных списка, накидал тут по быстрому: &lt;select...

6
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
02.07.2013, 17:49
Так и не понял при чем тут сравнение
1. добавить в listA те записи которые есть в listB, но не содержаться в listA
2. удалить из listA те записи, которых нет в listB

Самое простое что приходит на ум:
C#
1
2
listA.Clear();
listA.AddRange(listB);
Такой вариант устроит?
0
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
02.07.2013, 18:40  [ТС]
Сейчас так и делается. Проблема в том что при этом все существующие записи удаляются. Выделение с них исчезает. Я хочу чтобы текущие записи принимали новые значения, а лишние и отсутствующие удалялись и добавлялись соответственно.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
03.07.2013, 16:33
Цитата Сообщение от phantom96 Посмотреть сообщение
Сейчас так и делается. Проблема в том что при этом все существующие записи удаляются. Выделение с них исчезает. Я хочу чтобы текущие записи принимали новые значения, а лишние и отсутствующие удалялись и добавлялись соответственно.
Объясните подробнее что Вы хотите сделать. Что есть у Вас "выделение"? И вообще для чего нужен такой изврат?

Вы имеете возможность использовать не List<T> а LinkedList<T> или SortedSet<T>?
0
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
03.07.2013, 17:23  [ТС]
При клике мышкой по гриду строка выделяется. Вот это выделение терять и не хочу.

Ну причин которые мешают их использовать не вижу.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
04.07.2013, 13:16
Если грид - то причины не использовать есть

Вот почти оптимальный код для данной задачи:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void ReloadGridSourceWithSelectedSave<T>(DataGridView dataGridView, IList<T> newSourceList)
{
    ReloadGridSourceWithSelectedSave(dataGridView, newSourceList, Comparer<T>.Default);
}
 
static void ReloadGridSourceWithSelectedSave<T>(DataGridView dataGridView, IList<T> newSourceList, IComparer<T> comparer)
{
    dataGridView.SuspendLayout();               // приостанавливаем логику грида
    T[] selectedObjects = dataGridView.SelectedRows.Cast<DataGridViewRow>().Select(row => (T)row.DataBoundItem).ToArray(); // собираем все выделенные элементы в коллекцию
            
    dataGridView.DataSource = newSourceList;
    if (newSourceList.Count > 0)
    {
        Array.Sort(selectedObjects, comparer);              // сортируем для ускорения поиска
        foreach (DataGridViewRow row in dataGridView.Rows)  // перебираем все новые элементы
        {
            T item = (T)row.DataBoundItem;
            if (Array.BinarySearch(selectedObjects, item, comparer) >= 0)   // если элемент был выделенным - выделяем его снова
                row.Selected = true;
        }
    }
    dataGridView.ResumeLayout(true);            // восстанавливаем визуальную логику
}
Сравнивать списки тут совершенно не нужно.
1
MЫW
 Аватар для phantom96
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
05.07.2013, 16:32  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        static void ReloadGridSourceWithSelectedSave<T>(DataGrid dataGridView, IList<T> newSourceList, IComparer<T> comparer)
        {
            Person[] selectedObjects = dataGridView.SelectedItems.Cast<Person>().ToArray(); // собираем все выделенные элементы в коллекцию
 
            dataGridView.ItemsSource = newSourceList;
            if (newSourceList.Count > 0)
            {
                foreach (DataGridRow row in GetRows(dataGridView))  // перебираем все новые элементы
                {
                    Person item = (Person)row.Item;
                    foreach (Person selected in selectedObjects)
                    {
                        if (selected.Name == item.Name)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public static List<DataGridRow> GetRows(DataGrid grid)
        {
            List<DataGridRow> list = new List<DataGridRow>();
            for (int i = 0; i < grid.Items.Count; i++)
            {
                DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
                if (row == null)
                {
                    // May be virtualized, bring into view and try again.
                    grid.UpdateLayout();
                    grid.ScrollIntoView(grid.Items[i]);
                    row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
                }
                list.Add(row);
            }
            return list;
        }
Вроде работает... Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.07.2013, 16:32
Помогаю со студенческими работами здесь

Снова хром, снова сапопроизвольно открывается, снова bkrfdf.xyz и казино
Здравствуйте! Собственно, проблема уже не новая, хотя, как показывают сообщения форума, за последние дни выскочившая у многих. Через...

Как записать после сравнений что я сравниваю?
Программа ищет из 5 чисел 3 по возростанию. Здесь есть сравнения, типа f &lt; f и так далее ,так вопрос как после этих сравнений записать что...

Как сделать чтобы таймер дойдя до 0 стартовал снова и снова?
Здравствуйте :) Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? TimerSec = 59; TimerMin = 6; for(int i = TimerSec;...

HP 625 снова и снова перезагружается в безопасный не заходит
Ребята помогите , проблема вот какая врубаю я ноут он доходит до заставки майкрософта и снова перезагружается в безопасный не заходит, ...

Списки, списки, списки. не все так просто
Написать функцию, которая принимает 2 списка, содержащие одинаковое число строк, затем изменяет списки сопоставляя строки, занимающие...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru