2011-10-24 15 views
0

私は順列に関していくつかの助けが必要です。順列データ構造

私のシステムでは、さまざまなソフトウェアコンポーネントを実行するさまざまなデバイスがあります。

Software1: v1 
Software2: v1 
Software3: v1 

Software1: v1 
Software2: v2 
Software3: v1 

Software1: v2 
Software2: v1 
Software3: v1 
:イム言っコンポーネントのバージョンのすべての順列(ユニークな組み合わせを)見つけることに興味を持っており、この

struct Permutation 
{ 
    IComparable Software1{ get; set; } 
    IComparable Software2{ get; set; } 
    IComparable Software3{ get; set; } 
} 

ALAタプルや構造体のリストで終わる次に、このようなリストで終わります

ソフトウェアは、ツリー構造(ノード - >アイテム)で編成されたさまざまなコンポーネント上に存在します。子ノードのタイプは、私は簡単にnode.ChildrenIList<Node>)とnode.ParentNode)でツリーをナビゲートすることができます

Node->Root (L0) 
    Node->Parent (L1) 
     Node->ChildType1 (L2): has property Software1, Software2 
     Node->ChildType2 (L2): has property Software3 

をルックアップするためにソフトウェアのどのようなものを私に伝えます。

私はツリーをインオーダ反復し、全ての順列のリストを作成したいと思います。このために使用できる.netフレームワークには、既存のデータ構造がありますか?それを解決する方法についての提案はありますか?

+0

コードを表示する必要があります。先日私のサイトで汎用ツリー構造について書いたばかりです。\ – sehe

+0

多分それが助けになるでしょう。 [General Visitor Pattern](http://www.segerlabs.com/generic-visitor-pattern.aspx) –

答えて

1

私の考えは、これらの線に沿って次のようになります。

var list = from parent in root.Parents() 
       select new Permutation 
        { 
         Software1 = parent.ChildA.Software1, 
         Software2 = parent.ChildA.Software2, 
         Software3 = parent.ChildB.Software3, 
        }; 

    foreach (var perm in list.Distinct()) 
    { 
     // do something 
    } 

あなたは順列がうまく匹敵するとequatableであることを確認したいと思う:

struct Permutation : IEquatable<Permutation>, IComparable<Permutation> 
{ 
    public IComparable Software1 { get; set; } 
    public IComparable Software2 { get; set; } 
    public IComparable Software3 { get; set; } 

    public bool Equals(Permutation other) 
    { 
     return Equals(other.Software1, Software1) && Equals(other.Software2, Software2) && Equals(other.Software3, Software3); 
    } 

    public int CompareTo(Permutation other) 
    { 
     int cmp = 0; 
     if (0 == cmp) cmp = other.Software1.CompareTo(Software1); 
     if (0 == cmp) cmp = other.Software2.CompareTo(Software2); 
     if (0 == cmp) cmp = other.Software3.CompareTo(Software3); 
     return cmp; 
    } 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (obj.GetType() != typeof(Permutation)) return false; 
     return Equals((Permutation)obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      int result = (Software1 != null ? Software1.GetHashCode() : 0); 
      result = (result * 397)^(Software2 != null ? Software2.GetHashCode() : 0); 
      result = (result * 397)^(Software3 != null ? Software3.GetHashCode() : 0); 
      return result; 
     } 
    } 

    public static bool operator ==(Permutation left, Permutation right) 
    { 
     return left.Equals(right); 
    } 

    public static bool operator !=(Permutation left, Permutation right) 
    { 
     return !left.Equals(right); 
    } 
} 

私が取材を行うためにReSharperのを使用:)

+0

ありがとう、Distinct関数はトリックを行います:) – havardhu

+0

@havardhu:比較関数については忘れないでください(デフォルトではDistinct()は、 'EqualityComparer 'ジェネリッククラスの['Default'](http://msdn.microsoft.com/en-us/library/ms224763.aspx)プロパティで提供されるデフォルトの実装を使用しています。構造体は 'IEquatable 'を実装しています – sehe