簡體   English   中英

我應該使用什么 C# 數據結構?

[英]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應該也能正常工作,而不是像我的示例中那樣聲明ManufacturerProduct class。

MyDataStructure聽起來與Tuple非常相似。 有關三通用參數變體,請參見此處 Tuple為許多指定的其他類型提供了一個強類型容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM