![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Коллеги не могу разобраться как использовать по назначению Distinct, когда изначально есть List объективов и
distinct нужно применить к определенному полю объекта? Вот этот код не работает...
|
|||
|
||||
WarHog |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 20.10.2007 Где: Воронеж Репутация: нет Всего: 2 |
Во-первых, в твоем случае Distinct'у нужно передать класс, реализующий IEqualityComparer<Objects>, в котором ты задаешь, по каким критериям будет работать дистинкт. Например, в простейшем случае, если тебе нужно применение к F1, то нужно что-то вроде такого:
Но в таком случае для каждого нового типа сравнения придется определять новый класс компарера. Лучше сделать его универсальным, как-то так:
здесь в конструкторе ты передаешь делегаты, которые определяют сравнение твоих объектов между собой и взятие хэша для объекта. Работать это все будет так:
Соответственно, в делегатах вместо F1 можно взять любое свойство. Во-вторых, такое
приведет к тому, что у тебя будет массив из Char'ов, который ты потом запихиваешь в foreach и Char пытаешься неявно прокастить в строке. Делай что-то вроде
ну или переопределяй ToString у Objects'а ![]() --------------------
|
||||||||||
|
|||||||||||
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Отлично. Спасибо за развернутый ответ!
Я честно говоря пробовал создать Comparer реализовав этот интерфейс прям в классе обьекта Objects, но потом не смог его оттуда вытащить. Получается из-за одного поля создавать отдельный класс... А насколько этот способ быстрый если например сравнить его с обычным перебором т.е. выделить поле из объекта прошедшись по нему перебором, а затем взять Distinct()? |
|||
|
||||
WarHog |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 20.10.2007 Где: Воронеж Репутация: нет Всего: 2 |
Ну если ты сделаешь дженерик компаратор, то сможешь его использовать для любого типа.
т.е. сделать что-то вроде
? так будет, во-первых, только медленнее, а, во-вторых, на выходе ты получаешь IEnumerable<string>, в отличие от IEnumerable<T> Медленнее, потому что будет лишний select и потому что Distinct, не получив компарера, будет использовать в данном случае дефолтный GenericEqualityComparer<string> и дергать внутри тот же самый x.Equals(y). --------------------
|
||||||
|
|||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |