【问题标题】:Why isn't my object being updated为什么我的对象没有更新
【发布时间】:2015-11-02 20:08:05
【问题描述】:

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

我认为可能是我没有通过引用传递对象,而是添加了一个 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++;
}

【问题讨论】:

  • 您是否尝试过改用if (string.IsNullOrEmpty(user.ID))?您确定 ID 不为空(而不是空)吗?
  • myData 是 linq 查询的结果吗?如果是这样,它将在每次遍历序列时重新创建。
  • 这看起来像是一个用于...基本调试的工具。
  • 您的示例代码中似乎缺少某些内容。据我们所知,myData 没有填充任何内容。
  • 显示设置myData的代码。就目前而言,您显示的代码甚至不应该编译。

标签: c# foreach


【解决方案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”作为键,它将抛出一个异常说它不存在,因此您需要检查以确保它确实存在或添加它如果没有。

【讨论】:

  • 这真的是我问题的核心。我是否应该能够更新我在 foreach 循环中迭代的对象。我所看到的一切都表明这是可能的,但我无法让它发挥作用,我认为我应该能够在不创建新列表的情况下做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 2011-10-10
  • 2018-03-13
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多