Nesnelerin birçoğunu oluşturan ve her bir nesnenin Priority
özelliğini ayarlamak için bunların üzerinden yineleyen gerçekten basit bir programım var.IEnumerable - foreach döngüsünün içindeki nesneleri güncelle
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; }
}
Değiştirilmiş önceliklerle nesneleri içerecek Ana yöntemde IEnumerable
bekliyorum.
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 davranışın nedeni nedir ve ben çalışıyorum benim öncelikleri almak için buraya neyi değiştirmelisiniz: Ancak, hepsi varsayılan değeri 0. Burada günlük olduğunu var?
iki önemli gerçekleri: (1) bir sorgu ifadesinin değeri * Sorgu *, ve (2) bir sorgu yürütüldüğünde * sorgu yürütüldüğünde *. Bu ifade tatolojiler gibi görünebilir, ancak kodunuz onlara inanmadığınızı gösterir; Bir sorgu değerinin, sorgunun yürütülmesi olduğuna ve iki kez yürütmenin yalnızca bir kez gerçekleştirdiğine inandınız. –
@EricLippert, haklısınız, her zaman IEnumerable'ı bir sorgu temsili olarak değil (adından da anlaşılacağı gibi) _enumerate_ öğesi olarak tanımlayabilirim. Aynı zamanda, sadece diziden geçmeye ihtiyaç duyduğumda (ve asla eleman eklememeyi/çıkarmam), ToList'i aramadan tüm programım boyunca IEnumerable'ı güvenle kullanabileceğimi anlamış görünüyordu. Birçok kitap/makale önerdiği gibi, "yöntemler/sınıflar/programlar arasında geçiş yapmak için" mümkün olan en genel türü kullanmalısınız "ve burada yapmaya çalıştığım şey buydu. Şimdi görüyorum ki bundan daha karmaşık. –