【问题标题】:What C# Data Structure Should I Use?我应该使用什么 C# 数据结构?
【发布时间】: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&lt;T, U, V&gt;

另一个要求是可以有重复的项目。以下是我的想法:

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


【解决方案1】:

我将创建一个名为 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;}
}

然后使用带有 Select 扩展方法的 LINQ 投影来创建制造商对象。

【讨论】:

  • 看起来这个问题更多的是关于“LINQ 分组和集合”而不是建模ManufacturerProduct。正如您在问题中看到的那样,他已经有了ManufacturerProduct 的对象模型。
  • 我明白了,但为什么要在一个非常具体的场景中经历所有这些麻烦。如果建模正确,您可以使用 LINQ to Objects 以您想要的方式格式化数据(类似于上面的 John Saunders 问题)。
  • 没错,他在询问如何利用 LINQ to Objects 使用他已经创建的 ManufacturerProduct 类来塑造他的结果。你的答案只是在某种程度上重申了他的问题。
【解决方案2】:

像这样?

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 在构造匿名对象时应该同样有效,而不是像在我的样本。

【讨论】:

  • 您没有显示制造商和产品之间的关系,也没有在 Linq 查询中将“数据”元素作为参数的构造函数。我不明白这可以作为替代品。
  • 关系隐含在结果组中。构造函数应该是微不足道的,但取决于数据的来源。海报没有提供任何细节,但我认为它可能来自一些包含制造商和产品信息的大数据表,这些数据都包含在一个数据中。在这种情况下,这将是将制造商与产品联系起来最直接的方式。
【解决方案3】:

MyDataStructure 听起来与Tuple 非常相似。有关三通用参数变体,请参阅 hereTuple 为许多指定的其他类型提供了一个强类型容器。

【讨论】:

  • 我要玩这个。这是我得到的: var tuple = new List>>();
  • 这正是我想要的。查看我的最新编辑以了解我是如何使用它的。非常感谢!
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 2011-09-21
  • 2021-02-26
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多