Нужен эффективный способ вернуть все дубликаты из списка
Я собираюсь работать с коллекцией, содержащей около 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 () работает: