2009-10-06 14 views
2

我需要在內存中建立一個集合web文件,但它們之間的關係。那就是文件A(例如html)可能具有到文件B(例如css)和文件C(例如,javascript)的鏈接。同樣,文件D也可能需要文件B.如果我想刪除文件A,我需要確保它使用的任何文件(例如文件B)不被其他文件(例如文件D)使用。也許是這樣的:我可以使用C#集合來保存具有自引用關係的類實例嗎?

List<WebFile> list_of_webfiles 

    public class WebFile 
    - string url 
    - bool parentFile 

    public class FileRelationship 
    - private WebFile parentWebFile; 
    - private WebFile childWebFile; 

的問題 - 什麼是用C#來模擬這一目標的最佳方式是什麼?(例如其集合類型&如何建模)

注意 - 它在內存(無數據庫)進行建模,我需要能夠序列化到XML太節省。我的意思是什麼,看上去像這樣的例子...

 XmlSerializer serializer = new XmlSerializer(typeof(List<WebFile>)); 
     TextWriter textWriter = new StreamWriter(CONFIG_FILE_PATH); 
     serializer.Serialize(textWriter, list_of_webfiles); 
     textWriter.Close(); 

感謝

回答

1

這似乎意味着分層「樹」 relationsihp,你可能有

Class WebFile: 
- URL : string 
- Parent : WebFile 
- Children : WebFile[] (could be a list depending on the need) 

然後某處你有一個

List<WebFile> webFiles; 

這種方法可以很容易地遍歷webf樹找到相關的文件,但很難列出所有的文件。

或者,你可以存儲文件和關係的列表seperately

Class WebFile 
- URL : string 

Class WebFileRelationship 
- Parent : WebFile 
- Child : WebFile 

而且你有2個集裝箱

List<WebFile> webFiles; 
List<WebFileRelationship> relationships; 

這種方法可以很容易地列出所有關係或所有文件,但很難確定個人關係。

這一切都取決於你的應用程序,你需要更多關於個人文件或關係的信息嗎?

+0

我想我需要兩個。第一個選項看起來不錯,但是它更像是一張Hierachy地圖而不是Web地圖?例如,從我原來的單詞和例子中,文件B有兩個(2)實例?或者換句話說,我試圖瞭解「Children:WebFile []」數組是否包含WebFile的單獨實例,或者它是否僅僅引用了已經在列表中的現有WebFile對象? – Greg 2009-10-06 06:30:23

+0

它只是一個引用,就像一個指針,所以你可以添加一個現有的web文件到'children'列表中而不需要複製它 – TJB 2009-10-06 07:12:52

+0

另外,你可以省略父列表或者把它設置爲一個數組,這取決於你需要什麼。編寫一些你想要實現的僞代碼可能是有用的,然後相應地形成數據結構。 – TJB 2009-10-06 07:16:31

1

事實上,你有重複(根據多個文件需要B)意味着使用最明顯的「需求」結構作爲樹會很痛苦,因爲這將涉及多次嵌套B(從不同的父母)。幾個選項:

  • 將對象引用保留在對象模型中,但只列出文件中的名稱(或其他引用);相對簡單,但需要反序列化後修正
  • 只列出關係中的名稱(或其他參考),並在對象模型中鏡像此項 - 即「file.Parent」是一個鍵,而不是另一個對象
  • 有完整的對象模型,並使用圖形序列化,如DataContractSerializer與保護對象引用啓用

我可能會在最後兩個之間進行選擇;最後一個「不是很漂亮」的XML,但實現起來相對簡單。但我會試圖使用中間選項,並在對象模型中只有關鍵引用,即

[XmlType("file"), XmlRoot("file")] 
public class File { 
    [XmlAttribute("name")] 
    public string Name {get;set;} 
    [XmlElement("ref")] 
    public List<string> References {get;set;} 
    public File() {References = new List<string>();} 
} 

也許不是純粹的面向對象,但很容易做到。另外 - 避免重複數據的需要;如果您像上面一樣存儲它,則可以始終掃描以查看「使用此文件的內容」(如果需要,可以使用一些索引)。但試圖保持兩個方向的關係(即「UsedBy」)是一場噩夢。

+0

謝謝馬克 - 如果重點是讓我的簡單winforms應用程序有一個簡單的下載/安裝(例如clickonce),你會認爲運行你的上述方法仍然會優於查看輕量級數據庫,如SQLite或火鳥? (我仍然不確定這些捆綁下載/安裝作爲WinForms應用程序的一部分是多麼容易)... – Greg 2009-10-06 06:46:38

+0

PS。一個輕量級的數據庫仍然會讓我更容易服從我的要求來請求結構「給我所有的父文件X的子文件」我猜?如果我採用了基於collections/xml的方法,那麼在實現這些方法時仍然會有更多的工作。 – Greg 2009-10-06 06:48:55

相關問題