Какую структуру данных C # я должен использовать? - PullRequest
0 голосов
/ 11 августа 2011

Этот вопрос относится к 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);
    }
}

Ответы [ 3 ]

6 голосов
/ 11 августа 2011

Я бы создал класс с именем Производитель:

public class Manufacturer
{
    public int ManufacturerId { get; set;}
    public string Name { get; set; }
    public IEnumerable<Product> Products { get; set;}
}

Затем создайте класс Product:

public class Product
{
    public int ProductId { get; set;}
    public string Name { get; set;}
}

Затем используйте проекцию LINQ с методом расширения Расширения, чтобы создать объект «Изготовитель».

3 голосов
/ 11 августа 2011

Как?объявление класса Manufacturer и Product, как в моем примере.

2 голосов
/ 11 августа 2011

MyDataStructure звучит очень похоже на Tuple.См. здесь для варианта с тремя обобщенными параметрами.Tuple дает строго типизированный контейнер для ряда указанных других типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...