2017-11-01 4 views
0

多くの入力を持つエンジニアリングアプリケーションを構築しようとしています。リストとサブリストデータ構造

ユーザーは、建設に使用される材料を入力し、その仕様を記述する必要があるが、私は

enter image description here

enter image description here下の画像では、以下の構造を有しているネストされたリストのシステムをしようとして各アイテムは異なる仕様と技術データを持っています

画像に示されているように、私はリストを動的にして新しいリストを追加したり削除したりしようとしています。

私は私のデータベース

としての私のインターフェイスとSQLサーバーのためのC#を使用します。しかし、私はそのようなリストのデータ構造で立ち往生しています。

+0

まあこれはどの*リレーショナル日付ベース*の典型的な構造です。あなたの問題は何ですか?私はテーブル/タイプ 'パイプ'、 'スプリンクラー'、 '物質'、 'スケジュール'などを見ています。フィールド/プロパティ 'Material'、' Size'、スケジュールなど」 – InBetween

+0

問題SQLサーバーにテーブルを作成しようとしましたが、テーブルを正しく構築してもテーブル間の関係を作成できませんでした – Tima

答えて

1

多分このような何かがC#側であなたのために働くでしょう。 SQL側で

public class Option 
    { 
     public string Name { get; set; } 

     /// <summary> 
     /// Used to treat the sub options as seperate properties rather than 
     /// options for this property. 
     /// </summary> 
     public bool IsCategory { get; set; } 

     /// <summary> 
     /// Lists of available options for this property, or sub properties 
     /// for this property if `IsCategory` is true. 
     /// </summary> 
     public List<Option> Options { get; set; } 

     /// <summary> 
     /// If `IsCategory` is false, indicates the selected option for this property. 
     /// </summary> 
     public Option SelectedOption { get; set; } 

     public Option(string name, bool isCategory) 
     { 
      Name = name; 
      IsCategory = isCategory; 
      Options = new List<Options>(); 
     } 
    } 

    public void Example() 
    { 
     Option pipes = new Option("Pipes", true); 
     Option material = new Option("Material", false); 
     Option size= new Option("Size", false); 

     Option blackSteel = new Option("Black Steel", true); 
     Option stainlessSteel = new Option("Stainless Steel", true); 
     Option schedule = new Option("Schedule", false); 

     schedule.Options.Add(new Option("10", false)); 
     schedule.Options.Add(new Option("20", false)); 
     schedule.Options.Add(new Option("40", false)); 
     schedule.Options.Add(new Option("80", false)); 

     blackSteel.Options.Add(schedule); 
     stainlessSteel.Options.Add(schedule); 

     material.Options.Add(blackSteel); 
     material.Options.Add(stainlessSteel); 
     pipes.Options.Add(material); 
     pipes.Options.Add(size); 
    } 

、あなたは次のようにテーブルを作り、各オプションに一意のインデックスを与えることによって、これらのオプションを定義できます。

+---------+-----------------+---------------------+------------------+ 
| ID<INT> | NAME<VARCHAR> | ISCATEGORY<BOOLEAN> | OPTIONS<VARCHAR> | 
+---------+-----------------+---------------------+------------------+ 
| 0  | Pipes   | true    | 1,2    | 
| 1  | Material  | false    | 3,4    | 
| 2  | Size   | false    |     | 
| 3  | Black Steel  | true    | 5    | 
| 4  | Stainless Steel | true    | 5    | 
| 5  | Schedule  | false    | 6,7,8,9   | 
| 6  | 10    | false    |     | 
| 7  | 20    | false    |     | 
| 8  | 30    | false    |     | 
| 9  | 40    | false    |     | 
+---------+-----------------+---------------------+------------------+ 
1

あなたはツリー構造を探しているようですね。リンクされたリストはこれについて行くための素晴らしい方法です。 .NETには準備済みのLinkedList構造がありますが、必要なものは通常は最小限のバージョンであるため、自分で作成することをお勧めします。それぞれに

class Node 
{ 
    Dictionary<string, Node> SubLists { get; set; } 
    public List<string> Items { get; set; } 
} 

あなたがアイテム(その最後の場合)またはそれぞれが再びツリーのさらに下に行くかのアイテムを持っているし、最終であることをノードのリストを持つことができるのいずれかのノードの新しいリストを追加することができますどちらかサブリスト。これは、OSのディレクトリがどのように機能するか(正確ではありませんが、アイデアは似ています)

詳細については、リンクリストのフォローアップの一部を行うことができます。基本的なデータ構造であり、オンラインリソースの

SQLの問題は、ドキュメントをnvarchar(MAX)フィールドにJSONとして格納することで簡単に解決できます。

+0

例を覚えていますか、どこから開始するのか知っていますか? – Tima

+0

https://stackoverflow.com/questions/3823848/creating-a-very-simple-linked-list 一般に、それはまっすぐであるべきです。ちょうどあなたのIDEを撮影し、少し試してみて、それを試してみることです! –

+0

フォームにはリストやコンボボックスがあるので、このリンクされたリストをUIに実装する別の問題が残っているようですが、レベルが上がると(サブノード)コンボボックスも増えるので、リンクされたリストを実装するための最適なUI設計を見つけたり考える – Tima