Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能在IEnumerable循环中修改属性包(Dictionary)_C#_Ienumerable - Fatal编程技术网

C# 为什么不能在IEnumerable循环中修改属性包(Dictionary)

C# 为什么不能在IEnumerable循环中修改属性包(Dictionary),c#,ienumerable,C#,Ienumerable,考虑下面的测试程序,其中我滥用字典来包含可能具有未知字段和未知字段类型的文档 从集合的反序列化判断,对循环中的文档进行变异没有效果?这怎么可能?我错过了什么?我直接引用了循环中的文档对象 我直接引用了循环中的文档对象 不,你没有。您可以参考如何编制此数据的配方! 这就是延迟执行的意义所在 实际上,第一次在这一行执行查询: foreach(var doc in docs){ 这是你第一次做饭。你用自己的配料很好地添加了香料 当您序列化此行中的单据时: var serialized = JsonC

考虑下面的测试程序,其中我滥用字典来包含可能具有未知字段和未知字段类型的文档

从集合的反序列化判断,对循环中的文档进行变异没有效果?这怎么可能?我错过了什么?我直接引用了循环中的文档对象

我直接引用了循环中的文档对象

不,你没有。您可以参考如何编制此数据的配方! 这就是延迟执行的意义所在

实际上,第一次在这一行执行查询:

foreach(var doc in docs){
这是你第一次做饭。你用自己的配料很好地添加了香料

当您序列化此行中的单据时:

var serialized = JsonConvert.SerializeObject(docs);
您基本上再次执行GetDocuments中的查询。这就像你要写:

var serialized = JsonConvert.SerializeObject(GetDocuments());
这基本上意味着你要重新做饭。按照食谱,但是这次你没有像上次一样添加任何成分。然后你想知道为什么汤尝起来不像你第一次放进去的香料

如果在循环之前使用ToList调用具体化结果,则会得到所需的结果:

var docs = GetDocuments().ToList();

下面是一个关于

陷阱的详细说明,字典不是一成不变的,即使IEnumerable可能是。在我看来,这可能是一个与IEnumerable的延迟执行行为相关的问题。您是否尝试过创建实际的文档集合?i、 例如var docs=GetDocuments.ToArrayI我希望它修改字典,这就是我在循环中所做的。它没有,我应该能够将引用类型的任何instanec分配给该字典中的任何键,包括重新分配给新的引用类型。@bassfader似乎你是对的。。。强制它求值修复了它,但我希望newtonsoft再次求值IEnumerableb,但我希望newtonsoft再次求值IEnumerable,它确实求值可枚举。从而得到一套全新的文档。注意-这与newtonsoft没有任何关系-如果您进行第二次foreach循环,您会看到完全相同的情况。感谢您的精彩解释,我现在更了解它了。我只是不喜欢隐藏的实现,这让我想起了在Qt中与浅拷贝的斗争:p@arynaq不客气。是的,浅拷贝也有很好的陷阱。但这里的情况更糟;
var serialized = JsonConvert.SerializeObject(GetDocuments());
var docs = GetDocuments().ToList();