提问人:SNBS 提问时间:11/12/2023 更新时间:11/13/2023 访问量:79
变量自行更改?
Variable changing on its own?
问:
看看这个 GIF 就知道了 — 你能看到一个改变 值的语句吗?j
如果需要,这是我的代码:
for (int j = 0; j < types[i].GenericParameters.Count(); j++)
{
// typeDocs is XElement
// types[i].GenericParameters is a collection of objects (classes) with properties Name and Description
string value = FindElementValueByName(typeDocs, "typeparam",
types[i].GenericParameters.ElementAt(j).Name);
types[i].GenericParameters = types[i].GenericParameters.Select((p, index) =>
{
if (index == j) p.Description = value;
return p;
});
}
方法如下:FindElementValueByName
private string FindElementValueByName(XElement root, string searchFor, string compareTo)
{
return root.Elements(searchFor).FirstOrDefault(p =>
{
string? name = p.Attribute("name")?.Value;
if (name == null) return false;
return name == compareTo;
})?.Value ?? string.Empty;
}
真正让我惊奇的是,它是一个结构(),因此在传递给方法或任何地方时不应更改!j
int
仅供参考:我知道这句话在这里并不是真的必要。我尝试使用,但未设置Description
属性。在我当前的代码中,它仍然没有设置在 之后。Select
types[i].GenericParameters.ElementAt(j).Description = value;
Select
答:
1赞
György Kőszeg
11/13/2023
#1
您捕获传递给 的 lambda,它有一个惰性计算。如果您使用代码分析器或 ReSharper,则必须获得有关其可能副作用的一些警告。j
Select
在您的记录中没有第二次迭代(可能是因为该类型只有 1 个泛型参数,但我们看不到),因此您已经离开了传递给 的 lambda 正在执行时,但到那时已经有了它的最终值。for
Select
j
如果通过附加 或 来强制立即评估 ,则可能是一个修补程序。Select
.ToList().
.ToArray()
评论
0赞
SNBS
11/13/2023
谢谢!我忘记了延迟执行:(
上一个:Linq 按字典值搜索
评论
for
j
j++
if (index == j)
Select
types[i].GenericParameters.ToList()
Select
j
Select
Select