2013-02-26 2 views
2

У меня есть некоторые данные в списке, с которым я хочу сделать запрос. В то же время однако, другие пользователи могут добавить к этому списку, и я получаю неправильные детали взамен:Запретить новые значения из запроса LINQ

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

Затем пользователь может добавить элемент в список выбранных до того, как запрос выполняется, и я получу это тоже. Могу ли я предотвратить такое поведение ?:

selected.add("123www") 

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

Конечно, это должен был быть www. благодаря – perene

ответ

7

Значение переменной «запрос» только есть запрос, возложенные на него, но запрос сам сначала выполняется, когда запрос доступен, например, в цикл Еогеасп - следовательно, вы получите недавно добавленные данные.

Если вы не хотите этого, вы можете использовать метод расширения, как «ToList()», где коллекция остается прежним:

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

Здесь ToList() сразу же перебирает коллекцию и теперь вы можете перебирать queryResultList и получать правильные результаты, и хотя новые элементы поступают, результат остается неизменным.

0

Запрос представляет собой действие, которое может быть вызвано в любое время, когда вы хотите , и при изменении источника данных будут получены разные результаты.

Просто сделать «снимок» результатов в то время вы желаете сделать это с .ToArray():

var query = from s in selected 
       Where s.contains("www") 
       Select s) 
string[] snapshot = query.ToArray(); 
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" */ 
} 
Смежные вопросы