我做错了,因为在循环执行后,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++;
}
答案 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;作为一个关键,它会抛出一个例外,说它不存在所以你需要做一个检查以确保它确实存在或添加它,如果它没有。