0

コンテナー内でコンテナーを表現したいので、次のクラス構造を作成しました。

public class ContainerLib<T>
{
    /// <summary>
    ///  Generic container type
    /// </summary>
    public T Container { get; set; }

    /// <summary>
    /// Container type
    /// </summary>
    public Type ContainerType {
        get { return ContainerType; }
        set { value = typeof (T); }
    }

    /// <summary>
    /// ContainerLib enum
    /// May change to IList
    /// </summary>
    public IList<ContainerLib<T>> Containers { get; set; }
}

/// <summary>
/// Video container
/// </summary>
public class Container
{
    /// <summary>
    /// Container ID
    /// </summary>
    public int Id { get; set; }


    public string Name { get; set; }

    /// <summary>
    /// Details about the physical location of this container
    /// </summary>
    public LocationDefinition LocationDefinition { get; set; }

    /// <summary>
    /// Type of container - {layout, perspective, source
    /// </summary>
    public string ContainerType { get; set; }

    /// <summary>
    /// List of containers
    /// </summary>
    public IList<ContainerLib<Container>> Containers { get; set; }

}

これを実装する方法に少し行き詰まっています...これを正しく行っている場合:

        var containerLib = new ContainerLib<Container>
            {
                Container = new Container
                    {
                        Id = 1,
                        LocationDefinition = new LocationDefinition
                            {
                                WidthPixels = 100,
                                HeightPixels = 100,
                                NumColumns = 10,
                                NumRows = 10,
                                TopLeftX = 0,
                                TopLeftY = 0
                            },
                        ContainerType = "Layout"
                    }
            };

        containerLib.Containers = new List<ContainerLib<Container>>
            {
                // build nested structure here ../../../../

            };

したがって、データを構造に追加してから、それを反復処理したいと思います。

を使用する効率的な方法を見つけましたDictionaryが、それは私が探しているものではありません。

追加した

public IList<ContainerLib<Container>> Containers { get; set; }

に、そしてそれを行うことで、もうContainer必要なのかどうか疑問に思っていますか?ContainerLib<T>

よろしくお願いします。

4

1 に答える 1

3

私が質問を完全に理解したかどうかはわかりませんが、このようなクラスを持つことは非常に簡単ではないでしょうか (明確にするためにエラーチェックとプライベートバッキングフィールドは省略されています)。これにより、追加の ContainerLib クラスはまったく必要ありません:

public class Container
{
   public Container Parent{get;set;} //this is here in case you need to go back up :)
   public List<Container> Children{get;set;}
   //other properties i.e actual data go here

   public Container(Container parent)
   {
     this.Parent=parent;
      Children=new List<Container>();
   }

   public void AddContainer(Container child)
   {
     Children.Add(child);
     child.Parent=this;
   }

}

次に、次のように、構造全体を上から下に再帰的に歩くことができます。

void WalkContainerTree(Container currentRoot)
{
  if (currentRoot==null) return;
  //process the properties of currentRoot here to do whatever you like with them
  //then do the kids
   foreach (var child in currentRoot.Children)
   {
     WalkContainerTree(child);
   }
}

私が質問を誤解した場合はお詫びします:)

于 2013-10-02T19:17:31.153 に答える