我有一個非常簡單的程序,它可以創建一堆對象並遍歷它們來設置每個對象的Priority
屬性。IEnumerable - 更新foreach循環內的對象
static void Main(string[] args)
{
foreach (var obj in ObjectCreator.CreateObjectsWithPriorities())
Console.WriteLine(String.Format("Object #{0} has priority {1}",
obj.Id, obj.Priority));
}
class ObjectCreator
{
public static IEnumerable<ObjectWithPriority> CreateObjectsWithPriorities()
{
var objs = new[] { 1, 2, 3 }.Select(i => new ObjectWithPriority() { Id = i });
ApplyPriorities(objs);
return objs;
}
static void ApplyPriorities(IEnumerable<ObjectWithPriority> objs)
{
foreach (var obj in objs)
{
obj.Priority = obj.Id * 10;
Console.WriteLine(String.Format("Set priority of object #{0} to {1}", obj.Id, obj.Priority));
}
}
}
class ObjectWithPriority
{
public int Id { get; set; }
public int Priority { get; set; }
}
我在遏制與修改優先對象主要方法期待IEnumerable
。然而,所有的人都默認值爲0 這裏是日誌:
Set priority of object #1 to 10
Set priority of object #2 to 20
Set priority of object #3 to 30
Object #1 has priority 0
Object #2 has priority 0
Object #3 has priority 0
什麼是suche行爲的原因,我應該爲了得到我的優先工作改變嗎?
兩個重要的事實:(1)查詢表達式的值是一個*查詢*,和(2)在執行查詢*查詢執行時*。這些陳述似乎是重言式,但是你的代碼表明你不相信他們;您認爲查詢的值是查詢的執行,並且執行兩次的查詢只執行一次。 –
@EricLippert,你是對的,我一直認爲IEnumerable是一系列我可以通過(如名字所示)枚舉的元素,而不是查詢表示。這似乎也有道理,如果我只需要遍歷序列(並且永遠不添加/刪除元素),我可以安全地在整個程序中使用IEnumerable,而無需調用ToList。正如許多書籍/文章所暗示的那樣,「你應該使用可能的最普通類型」來在方法/類/程序之間傳遞對象,這就是我在這裏要做的。現在我發現它比這更復雜。 –