我应该使用什么样的c#数据结构?
本文关键字:数据结构 什么样 我应该 | 更新日期: 2023-09-27 18:05:03
这个问题与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);
}
}
我将创建一个名为Manufacturer的类:
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投影和Select扩展方法来创建Manufacturer对象。
像这样?
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
类在我的样本。
MyDataStructure
听起来很像Tuple
。请参阅这里的三个泛型参数变体。Tuple
为许多指定的其他类型提供了强类型容器。