Это происходит потому, что запросы LINQ оцениваются лениво: результат не создается до тех пор, пока он не должен быть (что происходит всякий раз, когда вы вызываете Count
). Само собой разумеется, что если вы измените user.Roles
между тем, Count
, вычисленное после модификации, будет другим.
Если вы хотите «исправить» результат, то вы должны заставить LINQ сделать локальную копию результатов, например, как это:
// Here, ToArray() forces LINQ to immediately produce the results
var matchedRoles = roles.Intersect(user.Roles).ToArray();
Таким образом, любые дальнейшие операции с matchedRoles
будут работать с фиксированным «снимком» и будут давать те же результаты, если вы не измените сам matchedRoles
.