2011-03-21 38 views
1

我不確定如何更新類數組中的字典。 我從xml中的xml加載升級,有更新數據的索引。從xml更新類數組中的數據的最佳方法[C#,Linq,XML]

我會一直更新,根據更新包含在陣列中的每一類中的數據...

我的數據結構是這樣的:

public class ContactData 
{ 
    public int UID { get; set; } 
    public string Status { get; set; } 
    ... 
} 

從XML我得到這個:

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<status> 
    <update> 
     <uid>336699</uid> 
     <state>My new state</state> 
    </update> 
    <update> 
     <uid>123456</uid> 
     <state>new state</state> 
    </update> 
    <update> 
     <uid>111111</uid> 
     <state>some state</state> 
    </update> 
</status> 

然後,我必須更新ContactData[] contacts只能通過XML的UID ...

聯繫人可以長度爲1000,xml可以有相同的長度...

如何執行快速更新?

編輯:

我這樣使用:

 XDocument doc = XDocument.Load("http://localhost/contact/xml/status.php"); 
     foreach (XElement node in doc.Descendants("update")) 
     { 
      var item = contactList.ListBox.Items.OfType<ContactData>().Where(i => i.UserID.ToString() == node.Element("uid").Value); 
      ContactData[] its = item.ToArray(); 
      if (its.Length > 0) its[0].Data["state"] = node.Element("state").Value; 
     } 

回答

2

我想有一個Dictionary<int, string>,它提供了非常關鍵的快速訪問,這樣你就可以測試是否存在的關鍵。如果它不存在,則插入它,如果它存在抱怨或更新它。

最後,您可以從字典中的每個KeyValuePair<int, string>構建新的ContactData對象。

對於大多數情況,這應該足夠快。

更新:加載現有ContactData[]成詞典:

foreach (ContactData cd in myData) 
{ 
    if (!dict.ContainsKey(cd.UID)) // Omit if you know they are unique. 
     dict.Add(cd.UID, cd.Status); 
} 

你就必須把我的頭頂部的三個選項:

  1. XmlDocument加載XML到這一點,然後拉出你的ContactData元素,在foreach中讀入字典。
  2. XmlReader只讀閱讀器用於流式傳輸XML,並在您流式傳輸時填充字典。
  3. LINQ to XML,一個例子轉義我,但最終的結果是,你會選擇可能作爲匿名類型的元素,然後可以填充你的字典。事實上,Linq可能可以讓你過濾掉重複的內容 - 如果你聰明的話可以避免使用字典。

然後在最後,將你的數組(或刷新它並調整它的大小),然後從字典中填充它。

+0

我需要更新一個存在的ContactData [],但我不知道如何做到這一點,沒有遞歸搜索每個元素... – Achilleterzo 2011-03-21 12:22:56

+0

我這樣做我的方式我發佈 – Achilleterzo 2011-03-22 11:08:39

相關問題