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

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

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

Author24 — интернет-сервис помощи студентам
Была тема:Сравнить 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2013, 03:52
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Вот почти оптимальный код для данной задачи:
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
124 / 109 / 9
Регистрация: 15.02.2013
Сообщений: 538
05.07.2013, 16:32  [ТС] 7
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
05.07.2013, 16:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2013, 16:32
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru