我在列表中有一些数据要进行查询。然而,在此期间,其他用户可以添加到此列表,我得到错误的项目作为回报:
var query = from s in selected
where s.contains("www")
select s);
然后用户可以在运行查询之前将项目添加到选定列表,我也会得到这个。我可以阻止这种行为吗?:
selected.add("123www")
foreach (var s in query)
/// gives me 123www
答案 0 :(得分:7)
var“query”只是为其分配了查询,但是在例如foreach循环中访问查询时首先执行查询本身 - 因此您将获得新添加的数据。
如果您不想这样,可以使用像“ToList()”这样的扩展方法,其中集合保持不变:
var queryResultList = (from s in selected
where n.contains("www")
select s).ToList();
这里ToList()立即迭代集合,你现在可以迭代queryResultList并获得正确的结果,即使新元素到达,输出也保持不变。
答案 1 :(得分:0)
查询表示一个动作,可以随时触发 如果数据来源发生变化,它将产生不同的结果。
只需使用.ToArray()创建结果的“快照”:
var query = from s in selected
Where s.contains("www")
Select s)
string[] snapshot = query.ToArray();
答案 2 :(得分:0)
当您致电.ToList()
或.ToArray()
时,会执行查询。因此,为了避免您的问题,您可以编写以下代码:
var query = from s in selected
where s.Contains("www")
select s);
var result = query.ToList();
selected.Add("123www");
foreach(var item in result)
{
/* You won't see "123www" */
}