2

我要查询的列表中有一些数据。然而,与此同时,其他用户可以添加到这个列表中,我得到错误的项目作为回报:

var query = from s in selected
            where s.contains("www")
            select s);

然后用户可以在运行查询之前将项目添加到选定列表中,我也会得到这个。我可以防止这种行为吗?:

selected.add("123www")

foreach (var s in query)
/// gives me 123www
4

3 回答 3

7

var“查询”只是分配给它的查询,但是当在例如 foreach 循环中访问查询时首先执行查询本身 - 因此您获得了新添加的数据。

如果你不想这样,你可以使用像“ToList()”这样的扩展方法,其中集合保持不变:

var queryResultList = (from s in selected
             where n.contains("www")
             select s).ToList();

这里 ToList() 立即迭代集合,您现在可以迭代 queryResultList 并获得正确的结果,即使新元素到达,输出也保持不变。

于 2013-02-26T19:36:26.210 回答
0

查询代表一个动作,可以随时触发,如果数据源发生变化,它将产生不同的结果。

只需在您希望使用 .ToArray() 时对结果进行“快照”:

var query = from s in selected
                Where s.contains("www")
                Select s)
string[] snapshot = query.ToArray();
于 2013-02-26T19:38:07.717 回答
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" */
}
于 2013-02-26T19:50:03.350 回答