阻止LINQ查询中的新值

本文关键字:新值 查询 LINQ 阻止 | 更新日期: 2023-09-27 18:01:10

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

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

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

selected.add("123www")
foreach (var s in query)
/// gives me 123www

阻止LINQ查询中的新值

var"query"只分配了查询,但查询本身是在例如foreach循环中访问查询时首先执行的,因此您可以获得新添加的数据。

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

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

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

查询表示一个操作,可以随时触发如果数据源发生变化,则会产生不同的结果。

只需在您希望使用.ToArray((:时对结果进行"快照"即可

var query = from s in selected
                Where s.contains("www")
                Select s)
string[] snapshot = query.ToArray();

当您调用.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" */
}