2011-08-10 11 views
0

この質問は、C#、LINQのグループ化とコレクションに関係しています。どのC#データ構造を使用すべきですか?

私は現在、グループ化の問題に取り組んでおり、コミュニティからのフィードバックを得たいと考えていました。私は過去にこの問題を抱えていましたが、自分のデータ構造を書くことを考えています。詳細はこちら

メーカーと製品で構成され、データ構造が製造元によってグループ化されているとします。多くのメーカーと多くの製品があります。メーカーはそれぞれ固有の名前とIDを持っています。製品の名前は似ているかもしれませんが、ユニークなIDを持っています。進行中のリストは、例を表しています。

フォード1、祝祭1945年トーラス6413、フュージョン4716、F1 8749、

トヨタ2、カムリ1311プリウス6415、カローラ1117タコマ9471

シボレー3、シルバラード4746、Camero 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つ必要ですか?なぜ匿名タイプを使用しないのですか? –

+1

データはどのように引き継がれますか?あなたは製造業者によって製品のリストを調べる必要がありますか?または、製品の製造元を見つけることができますか?または何? – SirPentor

+0

私はasp.netのツリービューコントロールにデータを使用しています。データベースからのデータはグループ化されずに戻ってくるので、データを簡単にグループ化して、イベントによってデータがフィルタリングされたときに簡単にアクセスできるようにしたい。 – Halcyon

答えて

2

MyDataStructureは、Tupleとよく似ています。 3ジェネリックパラメータの変形については、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)); 

EDIT:あなたは(あなたがあなたのアップデートで、今述べたように)匿名型を使用する場合は、匿名オブジェクトを構築した場合、その後GroupByは全く同じように動作するはずです、代わりに私のサンプルのようにManufacturerProductクラスを宣言。

+0

製造元と製品の間に関係はなく、Linqクエリのパラメータとして "data"要素を取るコンストラクタもありません。私はこれがどのように代替品として機能するのか分かりません。 –

+0

結果のグループには関係が暗黙的に含まれています。コンストラクタは自明なはずですが、データのソースの仕方によって異なります。ポスターにはそれに関する詳細は書かれていませんでしたが、メーカーデータと製品情報の両方を1つのデータムにまとめた大きいデータテーブルから来ていると思われました。その場合、これはメーカーと製品を関連付ける最も簡単な方法です。 – mquander

6

私はメーカーという名前のクラスを作成します。

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プロジェクションを使用しています。

+0

"LINQグループ化とコレクション*"についての質問は、 "Manufacturer"と "Product"のモデリングについての質問よりも多かったようです。この質問でわかるように、彼はすでに 'Manufacturer'と' Product'のオブジェクトモデルを持っています。 – ckittel

+0

私はそれを得るが、なぜ非常に特定のシナリオのためにそのすべてのトラブルを通過する。それが適切にモデル化されている場合は、LINQ to Objectsを使用してデータをフォーマットすることができます(上記のJohn Saundersの質問と同様)。 – Josh

+0

まさに彼は、既に作成された 'Manufacturer'クラスと' Product'クラスを使用してLINQオブジェクトを利用して結果をどのように形づくるかを尋ねています。あなたは答えは単純に彼の質問をある意味で再現していることです。 – ckittel

関連する問題