Нужен эффективный способ вернуть все дубликаты из списка

Я собираюсь работать с коллекцией, содержащей около 500000 предметов, и ищу достойный способ получить все дубликаты. Просматривая этот пост, я вижу, что наиболее популярным решением является использование хэшированного набора. Но что, если я хочу получить все автомобили красного цвета, а не только Car4 и Car5?

Car1.Color = Red;

Car2.Color = Blue;

Car3.Color = Green;

Car4.Color = Red;

Car5.Color = Red;

Учитывая проблему, что было бы достаточно быстрым способом сделать это?

РЕДАКТИРОВАТЬ: я видел в этом посте, что код ниже можно легко изменить в соответствии с моими потребностями. И я не уверен, что есть действительно лучший способ решить проблему, но я оставлю пост, чтобы посмотреть.

var duplicates = from car in cars
                 group car by car.Color into grouped
                 from car in grouped
                 select car;

3 ответа

Решение

Вы можете использовать метод расширения Enumerable.ToLookup, чтобы сгруппировать автомобили по цвету и получить все автомобили одного цвета:

var cars = new List<Car> { car1, car2, car3, car4, car5 };
var lookup = cars.ToLookup(car => car.Color);
var redCars = lookup[Red];
// redCars == { car1, car4, car5 }

Вы можете использовать группу по значению

class Car {
    public Color { get; set; }
}

void Main()
{
     List<Car> cars = GetList(); // not important
     var grouped = cars.GroupBy(c=>c.Color);
     var duplicates = cars.Where(g=>g.Count()>1);

}

Вы можете посмотреть на создание различных справочных таблиц, используя словарь. Например, если вы хотите выполнить поиск на Car.Color, у вас будет словарь>, поэтому при каждом добавлении новой машины вы также добавляете словарь цветов.

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

В противном случае, использование Enumerable.ToLookup() - это путь. Пожалуйста, смотрите эту ссылку для объяснения того, как ToLookup () работает:

http://msdn.microsoft.com/en-us/library/bb549073.aspx

Другие вопросы по тегам