【发布时间】:2011-10-24 12:08:15
【问题描述】:
这个问题与 C#、LINQ 分组和集合有关。
我目前正在处理一个分组问题,我想从社区获得一些反馈。过去我已经多次遇到这个特殊问题,我正在考虑为它编写自己的数据结构。以下是详细信息:
假设您有一个由制造商和产品组成的分组,并且数据结构按制造商分组。有许多制造商和许多产品。每个制造商都有一个唯一的名称和 ID。这些产品可能具有相似的名称,但它们确实具有唯一的 ID。下面的列表就是一个例子。
福特 1、嘉年华 1945、金牛座 6413、Fusion 4716、F1 8749、
丰田 2、凯美瑞 1311、普锐斯 6415、卡罗拉 1117、塔科马 9471
雪佛兰 3、Silverado 4746、Camero 6473、Volt 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
}
更新:
我决定使用元组数据结构。它非常强大且易于查询。处理代码是我最终使用它来创建制造商-车辆关系的方式。结果是一个有序的数据结构,其中包含按名称排序的唯一制造商及其关联的唯一车辆按名称排序。
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);
}
}
【问题讨论】:
-
为什么又需要一个?为什么不直接使用匿名类型?
-
数据如何获取?您是否需要按制造商查找产品列表?或者找到产品的制造商?还是什么?
-
我正在使用数据来填充 asp.net 中的树视图控件。从数据库返回的数据没有任何分组,我想要一个数据结构来轻松分组数据,以便在事件导致数据被过滤时轻松访问。
标签: c# .net linq data-structures collections