string[] colors = { "green", "brown", "blue", "red" };
var list = new List<string> (colors);
IEnumerable<string> query = list.Where (c => c.Length == 3);
list.Remove ("red");

Console.WriteLine (query.Count());

Queries execute not when constructed, but when enumerated. This is called lazy or deferred evaluation. Our query doesn't start executing until it encounters the aggregation operator, Count, which forces immediate enumeration. By that stage, red has been removed from the collection.

Any query operator that returns a scalar value or single element (such as Single or First) forces immediate execution.