2009-10-20 2 views
2

У меня есть список, в котором у MyClass есть свойство 'Name'. Я хочу знать, есть ли дубликат MyClass с тем же именем в списке.Как узнать, есть ли дубликаты в одном списке по сравнению с другим?

Кроме того, у меня есть другой список, и я хочу знать, если есть какие-либо дубликаты по сравнению с список А.

+0

Какая версия .NET, с какой версией VS вы используете? –

+1

Ни один из результатов поиска не помог? Я уверен, что это задавали много раз. http://stackoverflow.com/search?q=list+duplicates+c%23 –

+0

@Matt: Я думаю, вы ответили на свой вопрос, если бы все, что вы могли сделать, это указать мне на общий поисковый запрос, а не на дубликат. Но нет, я посмотрел, ближе всего это удаление дубликатов из списка, а не сравнение 2 списков. – esac

ответ

6

Чтобы ответить на первый вопрос

Я хочу знать, если есть повторяющиеся MyClass с тем же именем в списке .

вы можете сделать это:

bool hasDuplicates = 
    listA.Count != listA.Select(c => c.Name).Distinct().Count(); 

В ответ на второй вопрос

Кроме того, у меня есть другой список, и я хочу знать, если есть какие-либо дубликатов по сравнению с Список A.

Вы можете это сделать:

bool hasDuplicates = 
    differentList.Select(c => c.Name).Intersect(listA.Select(c => c.Name)).Any(); 
+0

Мне нужен пользовательский компаратор для первого anser? – SoftwareSavant

+0

За какую часть? Вызов Distinct будет использовать EqualityComparer .Default внутренне, если вы не предоставите IEqualityComparer . Значение по умолчанию описано здесь: http://msdn.microsoft.com/en-us/library/ms224763.aspx. –

2

Чтобы проверить наличие дублирующих имен в пределах одного List<MyClass>list:

var names = new HashSet<String>(); 
foreach (MyClass t in list) 
    if(!names.Add(t.Name)) 
     return "Duplicate name!" 
return "No duplicates!" 

или варианты в зависимости на том, что вы хотите делать, когда есть/не дублируются. В случае двух отдельных списков просто создайте набор из names из одного списка и зациклируйте с этим типом проверки на другом (детали зависят от того, что должно было произойти для дубликатов имен только в первом списке только во втором списке) или только между одним списком и другим, если каждый из них не содержит дубликатов при рассмотрении отдельно - ваши спецификации слишком неточны, чтобы позволить мне угадать, чего вы хотите или ожидаете в каждой из многих возможных комбинаций!

+0

+1 для упоминания HashSet .. спасибо :) –

+0

@Mahesh, приветствуем - хеш-таблицы - это очень общие инструменты (хотя я вижу точку в специфическом ответе @ gwiz на .NET, конечно, на основе хэш-подхода очень широко переносится ;-). –

+0

HashSets действительно сладкие. Ответчик отметил его на C#, поэтому я взял то, что ИМХО было C# -типом наименьшего сопротивления и максимальной удобочитаемости. Я не претендую на его производительность =) –