Удалить элемент имеют тот же ключ в списке C #

У меня List<Object> n Objects. В n Объекты есть какой-то объект, который у них одинаковый Id. Пример List<T> = {t1, t2, t3, t4, t5....,t10}.

при условии, что:

t1.Id = t5.id

Итак, я хочу удалить t5 из этого List.

Кто может мне помочь плз.

В этом вопросе: использование LINQ для удаления объектов в списке вы знаете, что этот объект дублируется (например, «bob»), но в моем вопросе в этом списке я не знаю ни одного дублированного объекта раньше.


person Sonrobby    schedule 05.04.2013    source источник
comment
Вы пробовали что-нибудь для решения своей проблемы? Сначала покажи свои усилия.   -  person Soner Gönül    schedule 05.04.2013
comment
Возможно, вы захотите посетить System.Collections.Generic.Dictionary класс, если только ваша домашняя работа / назначение абсолютно требует, чтобы вы использовали вместо этого List.   -  person Nolonar    schedule 05.04.2013
comment
Я новичок в LINQ. Я пробовал использовать цикл 2 for, но это решение не оптимизируется.   -  person Sonrobby    schedule 05.04.2013
comment
Если вам нужно оптимальное решение: эту проблему лучше всего решить с помощью Dictionary (как указано выше). Dictionary не позволяет добавлять несколько данных с одним и тем же ключом и очень быстро находит ключ.   -  person Nolonar    schedule 05.04.2013


Ответы (3)


Только с использованием LINQ to Objects:

source = source.GroupBy(t => t.id).Select(g => g.First()).ToList();
person MarcinJuraszek    schedule 05.04.2013
comment
+1 от меня. Также правильно, если вы не достаточно ленивы, чтобы использовать существующую реализацию) - person Sergey Berezovskiy; 05.04.2013
comment
@lazyberezovsky Я думаю, что загружать всю moreLinq сборку всего за один DistinctBy вызов может быть излишним. Вот почему я сначала разместил только ответ LINQ to Objects. - person MarcinJuraszek; 05.04.2013
comment
Ух ты. Вы правы, что особого (предиката) нет. Конечно, должно быть. И причина, по которой я так думал, конечно же, потому что я создал свой собственный: D, пойди. - person Anders Forsgren; 05.04.2013

Вы можете использовать расширение moreLinq (получить его из NuGet) DistinctBy

var result = list.DistinctBy(x => x.Id).ToList();
person Sergey Berezovskiy    schedule 05.04.2013
comment
В чем причина отрицательного голоса? - person Sergey Berezovskiy; 05.04.2013
comment
Я не голосовал против, но нет причин, по которым Distinct выберет первое, поскольку это реализовано с использованием хеш-набора или подобного. Поскольку он специально просил удалить t5, вы должны это гарантировать. Во всяком случае, это была моя первая реакция. Не знаю, почему вас проголосовали против. - person Lasse V. Karlsen; 05.04.2013
comment
На самом деле это не так для DistinctBy. Возможно, тогда не это было причиной голосования против. - person Lasse V. Karlsen; 05.04.2013
comment
@ LasseV.Karlsen Вы можете посмотреть DistinctBy реализацию и вы увидите, что он вернет первый. - person MarcinJuraszek; 05.04.2013
comment
Да, пошла, посмотрела первоисточник, вы правы. - person Lasse V. Karlsen; 05.04.2013

Попробуй это:

list.RemoveAll(input => list.Count(i => i.Id == input.Id) > 1);
person Hossein Narimani Rad    schedule 05.04.2013