Вы также можете использовать что-то вроде следующего, которое также должно быть O (N):
public IEnumerable<Pet> speciesChecker ()
{
_pets.GroupBy (p => p.Species)
.Select (g => new List<Pet> (g))
.Where (l => l.Count == 1)
.SelectMany (l => l);
}
Дополнительные Select (g => new List<Pet> (g))
могут быть излишними, но я считаю, что это поможет избежать повторения всей логики группировки во второй раз, что, как я полагаю, приведет к O (N ^ 2).
Редактировать: Хороший комментарий от Магнуса о конструкторе List, работающем в O (n), побеждающем цель ...
Как насчет:
public IEnumerable<Pet> speciesChecker ()
{
var groups = _pets.GroupBy (p => p.Species);
foreach (var grp in _pets.GroupBy (p => p.Species))
using (var e = grp.GetEnumerator ()) {
if (!e.MoveNext ())
continue;
var first = e.Current;
if (e.MoveNext ())
continue;
yield return first;
}
}
I думаю, это оптимизировано настолько, насколько вы можете, и будет работать в O (n). Мы также избегаем использования метода расширения IEnumerable<T>.Any ()
или IEnumerable<T>.Count ()
.
Мысли