2011-08-10 42 views
0

這個問題適用於C#,LINQ分組和集合。應該使用什麼C#數據結構?

我目前正在研究分組問題,我想從社區獲得一些反饋。過去我遇到過這個特殊的問題,我正在考慮爲它編寫自己的數據結構。以下是詳細信息:

假設您有一個由製造商和產品組成的分組,並且數據結構按製造商分組。有許多製造商和許多產品。每個製造商都有唯一的名稱和編號。這些產品可能有相似的名稱,但它們確實有獨特的ID。程序清單是一個例子。

福特1,嘉年華1945,牛牛6413,融合4716,F1 8749,

豐田2,凱美瑞1311,普銳斯6415,花冠1117,塔科馬9471

雪佛蘭3,Silverado的4746,卡梅羅6473,伏3334,塔霍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); 
    } 
} 
+1

爲什麼你還需要一個?爲什麼不使用匿名類型? –

+1

數據如何加入?你需要查看製造商的產品清單嗎?或找到產品的製造商?或者是什麼? – SirPentor

+0

我正在使用這些數據來填充asp.net中的treeview控件。來自數據庫的數據沒有任何分組,我想要一個數據結構來輕鬆分組數據,以便在事件導致數據過濾時輕鬆訪問。 – Halcyon

回答

2

MyDataStructure聽起來非常類似於Tuple。請參閱here瞭解三種通用參數變體。 Tuple爲許多指定的其他類型提供了強類型容器。

+0

我打算玩這個。這裏是我得到的:var tuple = new List >>(); – Halcyon

+0

這正是我所期待的。查看我的最新編輯以查看我是如何使用它的。非常感謝! – Halcyon

3

是這樣的?

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類作爲我的樣品中匿名對象, 。

+0

您在製造商和產品之間沒有顯示關係,也沒有將「數據」元素作爲Linq查詢中的參數的構造函數。我不明白這可以作爲替代品。 –

+0

該關係隱含在結果組中。構造函數應該是微不足道的,但取決於數據的來源。海報並沒有提供任何細節,但我認爲它可能來自一些大表中的聯合數據,包括製造商和產品信息,都包含在一個數據中。在這種情況下,這將是製造商與產品聯繫最直接的方式。 – mquander

6

我將創建一個類名爲製造商:

public class Manufacturer 
{ 
    public int ManufacturerId { get; set;} 
    public string Name { get; set; } 
    public IEnumerable<Product> Products { get; set;} 
} 

然後創建一個產品類別:

public class Product 
{ 
    public int ProductId { get; set;} 
    public string Name { get; set;} 
} 

然後使用LINQ投影與選擇擴展方法來創建制造商對象。

+0

這似乎是關於「LINQ分組和集合*」的問題,而不是關於建模「製造商」和「產品」的問題。正如你在問題中看到的那樣,他已經有了一個「製造商」和「產品」的對象模型。 – ckittel

+0

我明白了,但爲什麼要經歷一個非常特殊的情況。如果它的建模正確,你可以使用LINQ to Objects來格式化你想要的數據(類似於上面的John Saunders問題)。 – Josh

+0

確實,他在問如何利用LINQ to Objects來利用他已經創建的'Manufacturer'和'Product'類來塑造他的結果。你的回答只是簡單地重申他的問題。 – ckittel

相關問題