2015-11-02 118 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

相关问题