一棵用来管理文件的树,由两个类组成:
目录类public class Directory
{
  string strDirectoryID;
  string strParentID;
  List<Directory>;
  List<Document>;  public Directory SeekDirectoryByID(string ID)
  {
    ???
  }
  public Document SeekDocumentByID(string ID)
  {
    ???
  }
}文件类public class Document
{
  string strDocumentID;
  string strParentID;
}Directory里带问号的那两个方法,如何写?
必须把List<>里的对象直接返回来,不能赋给新的对象,因为要进行修改、删除等操作。

解决方案 »

  1.   

    SeekDirectoryByID方法:根据ID查找List<Directory>下任意的Directory对象,因为目录可能有若干层,不可能直接找到;
    SeekDocumentByID也是一样,
      

  2.   

    Document是引用类型,所以直接返回列表中的元素就可以了。对返回的Document对象操作就直接对列表中的对象操作了。
      

  3.   

    问题是树的层数是不确定的,每个Directory下的子结点列表保存在List<Directory>中。
    如果从根结点直接查找的话,子目录下的任何东西是不可能直接找到的。
      

  4.   

    最容易想到的方法无非是递归,但递归一来效率低下,再者我一上午都无法解决“并非所有代码路径都返回值”问题,代码如下:
            public Directory SeekSubDirectoryByID(string id)
            {
                if (this.subDirectory.Count > 0)
                {
                    foreach (Directory currentDirectory in this.subDirectory)
                    {
                        if (currentDirectory.ID == id)
                        {
                            return currentDirectory;
                        }
                        else
                        {
                            return currentDirectory.SeekSubDirectoryByID(id);
                        }
                    }
                }
                else
                {
                    return null;
                }
            }
      

  5.   

      public Directory SeekDirectoryByID(string ID)
      {
          if (this.strDirectoryID == ID)
          {
              return this;
          }      if (directories.Count <= 0)
          {
              return null;
          }      Directory currentDirectory;
          Directory searchResult;
          for (int i = 0; i < directories.Count; i++)
          {
              currentDirectory = directories[i];
              searchResult = currentDirectory.SeekDirectoryByID(ID);
              if (searchResult != null) break;
          }      return searchResult  }
      

  6.   

    public class Directory
    {
      string strDirectoryID;
      string strParentID;
      List<Directory> directories = new List<Directory>();
      List<Document> documents = new List<Document>();
        public Directory(string id, string pid)
        {
            strDirectoryID = id;
            strParentID = pid;
        }
        public void addToList(Directory d)
        {
            directories.Add(d);
        }    public String toString()
        {
            return (strDirectoryID + " " + strParentID);
        }  public Directory SeekDirectoryByID(string ID)
      {
          Console.WriteLine("in SeekDir, " + strDirectoryID);
          if (this.strDirectoryID == ID)
          {
              return this;
          }      if (directories.Count <= 0)
          {
              return null;
          }      Directory currentDirectory;
          Directory searchResult = null;
          for (int i = 0; i < directories.Count; i++)
          {
              currentDirectory = directories[i];
              searchResult = currentDirectory.SeekDirectoryByID(ID);
              if (searchResult != null) break;
          }      return searchResult;   }
      public Document SeekDocumentByID(string ID)
      {
          return new Document();
      }
    }
    public class Document
    {
      string strDocumentID;
      string strParentID;
    }
    以下是测试代码:
    static void findTree()
            {
                Directory d = new Directory(".","..");
                Directory d1_1 = new Directory("A1", ".");
                Directory result;
                d.addToList(d1_1);
                d1_1 = new Directory("A2", ".");
                d.addToList(d1_1);            result = d.SeekDirectoryByID(".");
                Console.WriteLine(result.toString());            result = d.SeekDirectoryByID("A1");
                Console.WriteLine(result.toString());            result = d.SeekDirectoryByID("A2");
                Console.WriteLine(result.toString());
                
                result = d.SeekDirectoryByID("A3");
                
                
                
            }SeekDocument 同理啊, 不帮你写了.
      

  7.   

    不是很清楚你到底要问个什么,我猜的大概是遍历未知层数的树状结构?
    这里有个我写的遍历树节点的方法,LZ看看对你有用不://接收TreeView对象
    public void search(TreeView n)
    {
            //查看是否有子节点
    if(n.Nodes.Count == 0)
    {
    MessageBox.Show("没有节点");
    }
    else
    {
                 //遍历本层所有子节点
                 for(int i = 0;(i < n.Nodes.Count)&&this.textBox1.Text == "" ; i++)
                 {
                     //调用查找方法
             this.textBox1.Text = searchN(n.Nodes[i]);
                 }
    }
    }//查找方法,接受节点对象
    public string searchN(TreeNode n)
    {
    if(n.IsSelected)
    {
    return n.Text;
    }
    else if(n.Nodes.Count == 0)
    {
    return "";
    }
    else
    {
                     //递归查找本层节点子节点
    for(int i = 0;i < n.Nodes.Count; i++)
    {
    string text = searchN(n.Nodes[i]);
    if(text != "")
    return text;
    else
    continue;
    }
    return "";
    }
    }