这种方法的实际内容并不重要,因为我猜这个问题特定于语言本身。所以就这样了。
这是我的方法片段:
private CellValidation.CellValidationResult Validate<B, I>(CellValidation cellToValidate, IList<B> baseListToValidateAgainst, IList<I> importListToValidateAgainst, string invalidMessage, DDSFieldEnum fieldEnum) where I : Entities.DDS.DDSEntityFieldBase where B : Entities.DDS.
//Remove all dashes and /'s for a more realistic mapping check. We don't want the mapping to fail just because the imports - may be different. Also, create local variables of the list as don't want to modify the actual db.
cellToValidate.Value = cellToValidate.Value.Replace("-", " ").Trim().ToLower();
// IList<B> baseList;
var baseList = baseListToValidateAgainst;
baseList.Select(x => { x.Value = x.Value.Replace("-", " ").Trim().ToLower(); return x; }).
...
所以我清楚地将本地baseList
变量设置为等于传入的参数,然后我修改baseList
变量。
但是,这似乎修改了参数baseListToValidateAgainst
,而不仅仅是局部变量baseList
。那是为什么?
答案 0 :(得分:1)
如您对问题的评论中所述,您不制作原始列表的副本,而是将变量baseListToValidateAgainst
指定为与{{1}相同的引用}}
如果您想要列表的新副本,请尝试baseListToValidateAgainst.ToList()
答案 1 :(得分:1)
当您将baseList
设置为baseListToValidateAgainst
时,您没有复制原始列表;您只需为原始文件创建参考。您对baseList
所做的任何更改都会对baseListToValidateAgainst
对象进行。
这将复制:
var baseList = baseListToValidateAgainst.ToList();
此外,如果类型B
是可变的,则创建列表副本是不够的:您还需要创建单个项目的副本。这一步可能不是直截了当的,因为它依赖于B
中存在的方法,它为您提供了一个副本。例如,如果Entities.DDS
有一个成员来制作该对象的副本,您可以这样写:
var baseList = baseListToValidateAgainst.Select(i => (B)i.Copy()).ToList();
答案 2 :(得分:-1)
然后我修改了baseList变量
不,你还没有修改它。您既没有修改变量(以后没有对它进行赋值,这是修改变量的意思),也没有修改变量引用的列表(您没有调用{的方法) {1}}改变它,例如List
或Add
),也没有改变该列表中的任何对象(你定义了一个查询,执行该查询时它会改变变量引用的列表中的项目,但是你从未真正执行过该查询,所以这些项目永远不会发生变异。
您应该避免引起副作用的查询。他们很困惑。如果要对该列表中的所有项目执行某些操作,请使用Remove
,这是该特定任务的正确工具:
foreach
现在你已成功改变了该列表中的项目。