| 1 2 |
| LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 08:57 |
| Через рефлектор не удается выковырнуть исходники сего (ну там автогенеренные классы итераторов торчат), а нужно, для написания своих велосипедов. Если есть у кого поделитесь пожалуйста. |
| Re: LINQ Except и Intersect: поделитесь исходниками | |
| От: | _FRED_ эксперт | ||
| Дата: | 02.09.10 09:13 |
| Здравствуйте, Аноним, Вы писали: А>Через рефлектор не удается выковырнуть исходники сего (ну там автогенеренные классы итераторов торчат), а нужно, для написания своих велосипедов. А>Если есть у кого поделитесь пожалуйста. А исходники выкачать (http://referencesource.microsoft.com/netframework.aspx) не судьба? Вам от какого фреймворка реализация нужна? Под катом от четвёртого.
What I've learned about software engineering: 1) Listen to smart people 2) Prefer simple to clever 3) Have no ego 4) Shut the fuck up. Не бойтесь делиться своими методами работы. Большинству людей будет тупо лень их использовать. |
| Re: LINQ Except и Intersect: поделитесь исходниками | |
| От: | samius | ||
| Дата: | 02.09.10 09:13 |
| Здравствуйте, Аноним, Вы писали: А>Через рефлектор не удается выковырнуть исходники сего (ну там автогенеренные классы итераторов торчат), а нужно, для написания своих велосипедов. А>Если есть у кого поделитесь пожалуйста. http://code.google.com/p/linqbridge/downloads/list |
| Re: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Lloyd | ||
| Дата: | 02.09.10 09:20 |
| Здравствуйте, Аноним, Вы писали: А>Через рефлектор не удается выковырнуть исходники сего (ну там автогенеренные классы итераторов торчат), а нужно, для написания своих велосипедов. Да там никокого rocket science-а нет. Просто заводится HashSet, в который добавляют все из второй коллекции, потом бегут по первой, проверяя наличие текущего элемента в HashSet-е и либо возвращая его, либо пропуская. |
| Re: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 09:38 |
| Здравствуйте, Аноним, Вы писали: Спасибо за ответы. Я как всегда с конца начал, а вообще стоит задача следующая: есть две последовательности. нужно выкинуть из первой все чего нет во второй, обновить существующие элементы, добавить новые. ну вот средствами Except и Intersect она решается, только не подходят мне стандартные т.к. каждый элемент первой последовательности хранится в Tag ListViewItem'а, а вторая последоватеность состоит уже из самих элементов и т.д. со всеми вытекающими... |
| Re[2]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | samius | ||
| Дата: | 02.09.10 09:48 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, Аноним, Вы писали: А>Спасибо за ответы. А>Я как всегда с конца начал, а вообще стоит задача следующая: есть две последовательности. нужно выкинуть из первой все чего нет во второй, обновить существующие элементы, добавить новые. А>ну вот средствами Except и Intersect она решается, только не подходят мне стандартные т.к. каждый элемент первой последовательности хранится в Tag ListViewItem'а, а вторая последоватеность состоит уже из самих элементов и т.д. со всеми вытекающими... Через удаление всех элементов с последующим добавлением новых решается и стандартными методами. Если надо удалить лишние, и добавить новые, то это Add/Remove, а значит linq тут поможет только для того чтобы понять что именно Add/Remove. |
| Re[3]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 11:29 |
| Здравствуйте, samius, Вы писали: S>Через удаление всех элементов с последующим добавлением новых решается и стандартными методами. Если надо удалить лишние, и добавить новые, то это Add/Remove, а значит linq тут поможет только для того чтобы понять что именно Add/Remove. да решеается и через удаление всех и добавление новых, при этом не запоминается текущая позиция скроллинга, выделенные элементы и т.д. и т.п. моя задача чтобы обновление было "прозрачно и красиво" не доставляя неудобств юзеру. и вот как раз linq тут мне помочь не может вследствии ограниченности Except и Intersect не имеющих перегрузки для функций "извлечения" значимых элементов из элементов последовательностей. |
| Re[4]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | samius | ||
| Дата: | 02.09.10 12:15 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, samius, Вы писали: S>>Через удаление всех элементов с последующим добавлением новых решается и стандартными методами. Если надо удалить лишние, и добавить новые, то это Add/Remove, а значит linq тут поможет только для того чтобы понять что именно Add/Remove. А>да решеается и через удаление всех и добавление новых, при этом не запоминается текущая позиция скроллинга, выделенные элементы и т.д. и т.п. А>моя задача чтобы обновление было "прозрачно и красиво" не доставляя неудобств юзеру. А>и вот как раз linq тут мне помочь не может вследствии ограниченности Except и Intersect не имеющих перегрузки для функций "извлечения" значимых элементов из элементов последовательностей. В чем проблема найти элементы, которые нужно удалить и удалить их в цикле, а потом найти что добавить и добавить их в цикле? |
| Re[2]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Sinix | ||
| Дата: | 02.09.10 12:27 |
| Здравствуйте, Аноним, Вы писали: А>ну вот средствами Except и Intersect она решается, только не подходят мне стандартные т.к. каждый элемент первой последовательности хранится в Tag ListViewItem'а, а вторая последоватеность состоит уже из самих элементов и т.д. со всеми вытекающими... Ну вот средствами Except и Intersect она не решается (в общем случае). И Except и Intersect устраняют дубликаты в исходной коллекции. |
| Re[4]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Lloyd | ||
| Дата: | 02.09.10 12:27 |
| Здравствуйте, Аноним, Вы писали: А>и вот как раз linq тут мне помочь не может вследствии ограниченности Except и Intersect не имеющих перегрузки для функций "извлечения" значимых элементов из элементов последовательностей. Можно подробнее по поводу выделенного. Что вы имеете в виду? |
| Re[3]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 12:59 |
| Здравствуйте, Sinix, Вы писали: S>Ну вот средствами Except и Intersect она не решается (в общем случае). И Except и Intersect устраняют дубликаты в исходной коллекции. уточнение: у меня последовательности уникальных элементов. тогда средствами except и intersect решается так:
но в мое случае проблема в том, что у меня есть ListView у которого каждый Item в Tag имеет ссылку на один из prev. а удалять/обновлять/добавлять нужно собственно Items. короче, задача: есть последовательность элементов (пусть будет элемент=сотрудник) из базы (сравнение их посредством Id — уникальный идентификатор). эти элменты отображаются в ListView. кажддый Item этого ListView имеет в Tag ссылку на сотрудника. задача: при обновлении (повторном чтении всего списка сотрудников из базы) обновить существующих (имена и какие-то отображаемые атрибуиты, включая ссылку в Tag), удалить несуществующих, добавить новых в ListView. |
| Re[4]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 13:04 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, Sinix, Вы писали: счейчас вообще решается задача ооочень по-тупому, а именно:
values — "новый" список сотрудников. в listview уже загружен "старый". нужно обновить всю информацию не очищая и заполняя заново список. хочу красивое быстрое решение. |
| Re[4]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Lloyd | ||
| Дата: | 02.09.10 13:09 |
| Здравствуйте, Аноним, Вы писали: А>короче, задача: есть последовательность элементов (пусть будет элемент=сотрудник) из базы (сравнение их посредством Id — уникальный идентификатор). эти элменты отображаются в ListView. кажддый Item этого ListView имеет в Tag ссылку на сотрудника. задача: при обновлении (повторном чтении всего списка сотрудников из базы) обновить существующих (имена и какие-то отображаемые атрибуиты, включая ссылку в Tag), удалить несуществующих, добавить новых в ListView. Два варианта: 1. Забиваешь на Except/Intersect и добиваешься тот же самого через простой Where 2. По данным из базы формируешь список ListViewItem-ов и используешь перегруженый Except/Intersect с самописным EqualityComparer-ом Я бы пошел по первому пути. |
| Re[5]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 13:09 |
| Здравствуйте, samius, Вы писали: S>В чем проблема найти элементы, которые нужно удалить и удалить их в цикле, а потом найти что добавить и добавить их в цикле? я тут Автор: и ниже уровнемДата: 02.09.10 Автор: описал более подробно задачуДата: 02.09.10 а не нравятся лишние "проходы" в цикле (по второй ссылке) |
| Re[5]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 13:18 |
| Здравствуйте, Lloyd, Вы писали: L>Два варианта: L>1. Забиваешь на Except/Intersect и добиваешься тот же самого через простой Where L>2. По данным из базы формируешь список ListViewItem-ов и используешь перегруженый Except/Intersect с самописным EqualityComparer-ом L>Я бы пошел по первому пути. к сожалению я понял что второй (2) путь невозможен, т.к. для обновления существующих элементов нужна будет инфа сразу о старом и новом (от старого ListViewItem а от нового value). если исходить из
то Intersect никак не сможет вернуть мне такую инфу. даже самописный Intersect не вернет так как базируется на Set подскажите, что можно улучшить url=http://rsdn.ru/forum/dotnet/3943931.1.aspx Автор: ]здесь[/url]?Дата: 02.09.10 |
| Re[6]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Lloyd | ||
| Дата: | 02.09.10 13:28 |
| Здравствуйте, Аноним, Вы писали: А>к сожалению я понял что второй (2) путь невозможен, т.к. для обновления существующих элементов нужна будет инфа сразу о старом и новом (от старого ListViewItem а от нового value). если исходить из А>
А> то Intersect никак не сможет вернуть мне такую инфу. сможет, если напишешь свой EqualityComparer |
| Re[7]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 862 | ||
| Дата: | 02.09.10 13:31 |
| Здравствуйте, Lloyd, Вы писали: L>Здравствуйте, Аноним, Вы писали: А>>к сожалению я понял что второй (2) путь невозможен, т.к. для обновления существующих элементов нужна будет инфа сразу о старом и новом (от старого ListViewItem а от нового value). если исходить из А>>
А>> то Intersect никак не сможет вернуть мне такую инфу. L>сможет, если напишешь свой EqualityComparer каким образом? не для сравнения, а обновления Item. т.е. мне в качестве результата от Intersect нужна последовательность из пары значений (см выделенное) |
| Re[8]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Lloyd | ||
| Дата: | 02.09.10 13:36 |
| Здравствуйте, Аноним, Вы писали: L>>сможет, если напишешь свой EqualityComparer А>каким образом? не для сравнения, а обновления Item. т.е. мне в качестве результата от Intersect нужна последовательность из пары значений (см выделенное) Да, теперь дошло, что ты имел в виду. Да, не сможет, но сможет получить список того, что нужно обновлять. |
| Re[6]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | samius | ||
| Дата: | 02.09.10 16:54 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, samius, Вы писали: S>>В чем проблема найти элементы, которые нужно удалить и удалить их в цикле, а потом найти что добавить и добавить их в цикле? А>я тут Автор: и ниже уровнемДата: 02.09.10 Автор: описал более подробно задачуДата: 02.09.10 А>а не нравятся лишние "проходы" в цикле (по второй ссылке) Чем? Позиций в списке миллион? В первом варианте можно использовать Where для получения лишних элементов списка. Можно сделать красиво, но это будет 2 прохода (что не есть плохо). Второй вариант: пробег по массиву внутри второго цикла заменить на HashSet. Можно так: 1) из values получить HashSet. 2) проходя по элементам листбокса удаляем их Tag-и их из HashSet-а методом Remove и внимательно смотрим на результат. Если false — удаляем элемент из лисбокса. 3) для оставшихся элементов в HashSet добавляем элементы листбокса. |
| Re[7]: LINQ Except и Intersect: поделитесь исходниками | |
| От: | Аноним 785 | ||
| Дата: | 03.09.10 03:18 |
| Здравствуйте, samius, Вы писали: S>Чем? Позиций в списке миллион? нет конечно, но мало ли, станет тысяча через время... S>В первом варианте можно использовать Where для получения лишних элементов списка. Можно сделать красиво, но это будет 2 прохода (что не есть плохо). S>Второй вариант: пробег по массиву внутри второго цикла заменить на HashSet. S>Можно так: S>1) из values получить HashSet. S>2) проходя по элементам листбокса удаляем их Tag-и их из HashSet-а методом Remove и внимательно смотрим на результат. Если false — удаляем элемент из лисбокса. S>3) для оставшихся элементов в HashSet добавляем элементы листбокса. спасибо, попробую применить |
| 1 2 |