为什么我的对象没有更新

时间:2015-11-02 20:08:05

标签: c# foreach

我做错了,因为在循环执行后,myData仍然包含空白ID的对象。为什么不在以下foreach循环中更新myData对象,我该如何解决?

我认为可能是因为我没有通过引用传递对象,但是添加了一个ref关键字并且还移到了main方法中,我仍然显示该对象没有被更新。

其他信息

正在更新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++;
}

1 个答案:

答案 0 :(得分:-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中。

现在我的问题是:哪个&#34; id&#34;是空白的? &#34; id&#34;在字典中还是模型的ID?您的所有(型号).ID都是空白的吗?作为您的更新代码,如果您的字典没有&#34; id&#34;作为一个关键,它会抛出一个例外,说它不存在所以你需要做一个检查以确保它确实存在或添加它,如果它没有。