| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Distinct в Liste |
| Автор: Stratus 9.8.2011, 23:36 | ||
| Коллеги не могу разобраться как использовать по назначению Distinct, когда изначально есть List объективов и distinct нужно применить к определенному полю объекта? Вот этот код не работает...
|
| Автор: WarHog 10.8.2011, 09:21 | ||||||||||
Во-первых, в твоем случае Distinct'у нужно передать класс, реализующий IEqualityComparer<Objects>, в котором ты задаешь, по каким критериям будет работать дистинкт. Например, в простейшем случае, если тебе нужно применение к F1, то нужно что-то вроде такого:
Но в таком случае для каждого нового типа сравнения придется определять новый класс компарера. Лучше сделать его универсальным, как-то так:
здесь в конструкторе ты передаешь делегаты, которые определяют сравнение твоих объектов между собой и взятие хэша для объекта. Работать это все будет так:
Соответственно, в делегатах вместо F1 можно взять любое свойство. Во-вторых, такое
приведет к тому, что у тебя будет массив из Char'ов, который ты потом запихиваешь в foreach и Char пытаешься неявно прокастить в строке. Делай что-то вроде
ну или переопределяй ToString у Objects'а |
| Автор: Stratus 10.8.2011, 18:32 |
| Отлично. Спасибо за развернутый ответ! Я честно говоря пробовал создать Comparer реализовав этот интерфейс прям в классе обьекта Objects, но потом не смог его оттуда вытащить. Получается из-за одного поля создавать отдельный класс... А насколько этот способ быстрый если например сравнить его с обычным перебором т.е. выделить поле из объекта прошедшись по нему перебором, а затем взять Distinct()? |
| Автор: WarHog 10.8.2011, 21:59 | ||||||
Ну если ты сделаешь дженерик компаратор, то сможешь его использовать для любого типа.
т.е. сделать что-то вроде
? так будет, во-первых, только медленнее, а, во-вторых, на выходе ты получаешь IEnumerable<string>, в отличие от IEnumerable<T> Медленнее, потому что будет лишний select и потому что Distinct, не получив компарера, будет использовать в данном случае дефолтный GenericEqualityComparer<string> и дергать внутри тот же самый x.Equals(y). |