Этот вопрос относится к C #, группировке LINQ и коллекциям.
В настоящее время я работаю над проблемой группирования и хочу получить отзывы от сообщества. Я сталкивался с этой конкретной проблемой достаточно много раз в прошлом, и я думаю написать свою собственную структуру данных для нее. Вот подробности:
Предположим, у вас есть группа, которая состоит из производителя и продуктов, а структура данных сгруппирована по производителю. Есть много производителей и много продуктов. Каждый из производителей имеет уникальное имя и идентификатор. Продукты могут иметь похожие названия, но у них есть уникальные идентификаторы. Исходный список представляет собой пример.
Ford 1, Fiesta 1945, Taurus 6413, Fusion 4716, F1 8749,
Тойота 2, Камри 1311, Приус 6415, Королла 1117, Такома 9471
Chevrolet 3, Silverado 4746, Camero 6473, Вольт 3334, Tahoe 9974
и т.д ...
Структура данных, которую я бы использовал для представления этого, была бы
IEnumerable<Manufacturer, ManufacturerID, IEnumerable<Product, ProductID>>
но этого не существует. Поэтому мой вопрос, который я хочу задать сообществу, какую структуру данных вы бы порекомендовали и почему?
Обновление:
Я бы хотел сохранить анонимность типов и избегать динамического ключевого слова. Таким образом, структура данных будет выглядеть примерно так:
IEnumerable SomeDataStructure<T, U, V>
Другое требование заключается в том, что могут иметь дублирующиеся элементы. Вот то, о чем я думаю:
public class MyDataStructure<T, U, V>
{
// make this like a list, not a dictionary
}
Обновление:
Я решил использовать структуру данных Tuple. Это очень мощный и простой запрос. Исходящий код - то, как я закончил использовать его, чтобы создать мои отношения изготовителя с транспортным средством. В результате получается хорошо упорядоченная структура данных, в которой уникальные производители упорядочены по имени, а связанные с ними уникальные автомобили упорядочены по имени.
public class ManufacturersVehicles
{
public int ManufacturerID { get; set; }
public string ManufacturerName { get; set; }
public int VehicleID { get; set; }
public string VehicleName { get; set; }
}
// "data" actually comes from the database. I'm just creating a list to use a mock structure to query against.
var data = new List<ManufacturersVehicles>
{
{ ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 1945, VehicleName = "Fiesta" },
{ ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 6413, VehicleName = "Taurus" },
{ ManufacturerID = 1, Manufacturer = "Ford", VehicleID = 4716, VehicleName = "Fusion" },
etc...
};
// Get a collection of unique manufacturers from the data collection and order it by the manufacturer's name.
var manufacturers = data.Select(x => new { ManufacturerID = x.ManufacturerID, ManufacturerName = x.ManufacturerName })
.Distinct()
.OrderBy(x => x.ManufacturerName)
.Select(x => Tuple.Create(x.ManufacturerID, x.ManufacturerName, new Dictionary<int, string>()))
.ToList();
// Add the manufacturer's vehicles to it's associated dictionary collection ordered by vehicle name.
foreach (var manufacturer in manufacturers)
{
// Get the collection of unique vehicles ordered by name.
var vehicles = _alertDetails.Where(x => x.ManufacturerID == manufacturer.Item1)
.Select(x => new { VehicleID = x.VehicleID, VehicleName = x.VehicleName })
.Distinct()
.OrderBy(x => x.VehicleName);
foreach (var vehicle in vehicles)
{
manufacturer.Item3.Add(vehicle.VehicleID, vehicle.VehicleName);
}
}