2015-11-02 156 views
-3

我做錯了什麼,因爲之後執行myData的循環更新的靜止包含空白IDS對象。爲什麼不在以下foreach循環中更新myData對象,以及如何修復它?爲什麼我對象被

我認爲這可能是因爲我沒有被引用傳遞對象,但增加了一個ref關鍵字並且還移動到主方法和我仍然示出所述對象不被更新。

其他信息

在foreach循環,用戶正在更新對象,但myData的列表並不反映我看到更新被應用到用戶對象。

**解決方案** 我並沒有創建一個List,而是一個Enumerable,每當我通過一個foreach列表中的myData時,它都拉動了json。添加一個ToList()修復了我的問題。

public class MyData 
{ 
    public string ID { get; set; } 
    public Dictionary<string, string> Properties { get; set; } 
} 

int index = 0; 
// Does not allow me to up, creates an IEnumerable 
//IEnumerable<MyData> myData = JObject.Parse(json)["Users"] 
//         .Select(x => new MyData() 
//           { 
//            ID = x["id"].ToString(), 
//            Properties = x.OfType<JProperty>() 
//                .ToDictionary(y => y.Name, y => y.Value.ToString()) 
//           }); 

//Works allows me to update the resulting list. 
IEnumerable<MyData> myData = JObject.Parse(json)["Users"] 
            .Select(x => new MyData() 
              { 
               ID = x["id"].ToString(), 
               Properties = x.OfType<JProperty>() 
                   .ToDictionary(y => y.Name, y => y.Value.ToString()) 
              }).ToList(); 

foreach (var user in myData) // Also tried myData.ToList() 
{ 
    if (string.IsNullOrEmpty(user.ID)) 
    { 
     user.ID = index.ToString(); 
     user.Properties["id"] = index.ToString(); 
    } 

    index++; 
} 
+2

您是否嘗試過使用'如果(string.IsNullOrEmpty(user.ID))'呢?你確定ID不是空的(而不是空的)? –

+0

mydata在哪裏更新? –

+0

這最後'user.ID'應該可能是'index' –

回答

-1
public class MyData 
{ 
    public MyData() 
    { 
     this.Properties = new Dictionary<string,string>(); 
    } 
    public string ID { get; set; } 
    public Dictionary<string, string> Properties { get; set; } 
} 

public static void Main(string[] args) 
{ 
    IEnumerable<MyData> myDataList = new List<MyData>(); 
    int index = 0; // Assuming your starting point is 0 
    foreach (var obj in myDataList) 
    { 
     if (obj != null && string.IsNullOrEmpty(obj.ID)) 
     { 
      obj.ID = index.ToString(); 
      // Checks if the Properties dictionary has the key "id" 
      if (obj.Properties.ContainsKey("id")) 
      { 
       // If it does, then update it 
       obj.Properties["id"] = obj.ID; 
      } 
      else 
      { 
       // Else add it to the dictionary 
       obj.Properties.Add("id", obj.ID); 
      } 
     } 
     index++; 
    } 

我相信,爲什麼你的對象沒有更新,因爲它可能仍然參照該內存塊的對象改變之前的原因。也許。最簡單的方法(我能想到的,有成千上萬聰明的程序員比我更聰明)是創建一個新列表並讓它包含所有更新的對象。

編輯
我用上面的代碼更新了我的代碼。我創建的對象的少量設置爲測試方法:

private static IEnumerable<MyData> GetMyData() 
{ 
    return new List<MyData>() 
    { 
     new MyData(), 
     new MyData() {ID = "2"}, 
     new MyData() {ID = "3"}, 
     new MyData() 
    }; 
} 

我可以查看我的更改,然後經過一個foreach循環來查看我的變化。如果對象的ID是Null或Empty,那麼它會進入if檢查並如您所知將當前的index添加到ID。

現在我的問題:哪「ID」是空白的?字典中的「id」還是模型的ID?你的(Model).ID都是空白的嗎?作爲你的更新代碼,如果你的字典沒有「id」作爲鍵,它會拋出一個異常說它不存在,所以你需要做一個檢查以確保它存在或添加它如果沒有。

+0

這真的是我的問題的核心。我應該能夠更新我在foreach循環中迭代的對象。我所看到的一切都指向了可能,但是我無法實現它,我認爲我應該可以在不創建新列表的情況下做到這一點。 – user2197446

相關問題