Thursday, July 28, 2011

HasDuplicates

Extension:

Unit tests:

7 comments:

Valik said...

Мне нравится!

Bashir Magomedov said...

Спасибо :)

Ilya Troitskiy said...

Есть подозрение, что код несколько неоптимален. Я на 100% не уверен, может компилятор очень умный сейчас, но похоже, что тут лишний проход по листу имеется. IndexOf можно избежать. Например, как-то так:
public static bool HasDuplicates(this List list)
{
for (int i = 0; i < list.Count(); i++)
{
if (list.LastIndexOf(list[i]) != i)
return true;
}

return false;
}

Код, конечно, покорявее, но без лишнего прохода по списку. Или я не прав?

Bashir Magomedov said...

Прав. Его вообще за O(N) можно написать, правда там дополнительная коллекция нужна. Просто удалось написать в одну строчку, и довольно-таки читабельно, вот и решил поделиться.

Ilya Troitskiy said...

Тогда еще вариант:
return list.Distinct().Count() != list.Count();

:)

Alfishe said...

Ага, а в реальной жизни вся эта прелесть рухнет на первом же переданном Null и 100% заявленное покрытие юнит тестами не спасет =))

Bashir Magomedov said...

@Alfishe. А что плохого в ArgumentNullException? Или их принято глотать? :) Если бы Any не бросал внятный ArgumentNullException, я бы его сам бросил в самом начале, а там дальше кому надо пусть обрабатывает и узнает как так получилось, что аргумент вдруг указывает в никуда. Да и не заявлял я о 100%-ном покрытии :)