[英]What C# Data Structure Should I Use?
此问题与 C#、LINQ 分组和 Collections 相关。
我目前正在处理一个分组问题,我想从社区获得一些反馈。 过去我已经多次遇到这个特殊问题,我正在考虑为它编写自己的数据结构。 以下是详细信息:
假设您有一个由制造商和产品组成的分组,并且数据结构按制造商分组。 有许多制造商和许多产品。 每个制造商都有一个唯一的名称和 ID。 这些产品可能具有相似的名称,但它们确实具有唯一的 ID。 进程列表代表一个例子。
福特 1、嘉年华 1945、金牛座 6413、Fusion 4716、F1 8749、
丰田 2、凯美瑞 1311、普锐斯 6415、卡罗拉 1117、塔科马 9471
雪佛兰 3、Silverado 4746、Camero 6473、Volt 3334、Tahoe 9974
ETC...
我用来表示这一点的数据结构是
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
}
更新:
我决定使用元组数据结构 go。 它非常强大且易于查询。 处理代码是我最终使用它来创建制造商-车辆关系的方式。 结果是一个有序的数据结构,其中包含按名称排序的唯一制造商以及按名称排序的相关唯一车辆。
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);
}
}
我将创建一个名为制造商的 class:
public class Manufacturer
{
public int ManufacturerId { get; set;}
public string Name { get; set; }
public IEnumerable<Product> Products { get; set;}
}
然后创建一个产品 class:
public class Product
{
public int ProductId { get; set;}
public string Name { get; set;}
}
然后使用 LINQ 投影和 Select 扩展方法创建制造商 object。
像这样?
public class Manufacturer : IEquatable<Manufacturer>
{
public string Name { get; private set; }
public int ID { get; private set; }
// ...
}
public class Product
{
public string Name { get; private set; }
public int ID { get; private set; }
// ...
}
// groups is of type IEnumerable<IGrouping<Manufacturer, Product>>
var groups = data.GroupBy(row => new Manufacturer(row), row => new Product(row));
编辑:如果您想使用匿名类型(正如您现在在更新中提到的那样),那么如果您构造匿名对象, GroupBy
应该也能正常工作,而不是像我的示例中那样声明Manufacturer
和Product
class。
MyDataStructure
听起来与Tuple
非常相似。 有关三通用参数变体,请参见此处。 Tuple
为许多指定的其他类型提供了一个强类型容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.