c# – IEnumerable – 更新foreach循环内的对象

前端之家收集整理的这篇文章主要介绍了c# – IEnumerable – 更新foreach循环内的对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个非常简单的程序,创建一堆对象,并通过它们迭代来设置每个对象的Priority属性.
  1. static void Main(string[] args)
  2. {
  3. foreach (var obj in ObjectCreator.CreateObjectsWithPriorities())
  4. Console.WriteLine(String.Format("Object #{0} has priority {1}",obj.Id,obj.Priority));
  5. }
  6.  
  7. class ObjectCreator
  8. {
  9. public static IEnumerable<ObjectWithPriority> CreateObjectsWithPriorities()
  10. {
  11. var objs = new[] { 1,2,3 }.Select(i => new ObjectWithPriority() { Id = i });
  12. ApplyPriorities(objs);
  13. return objs;
  14. }
  15.  
  16. static void ApplyPriorities(IEnumerable<ObjectWithPriority> objs)
  17. {
  18. foreach (var obj in objs)
  19. {
  20. obj.Priority = obj.Id * 10;
  21. Console.WriteLine(String.Format("Set priority of object #{0} to {1}",obj.Priority));
  22. }
  23. }
  24. }
  25.  
  26. class ObjectWithPriority
  27. {
  28. public int Id { get; set; }
  29. public int Priority { get; set; }
  30. }

我期待在Main方法中的IEnumerable包含修改优先级的对象.但是,它们都具有默认值0.
这是日志:

  1. Set priority of object #1 to 10
  2. Set priority of object #2 to 20
  3. Set priority of object #3 to 30
  4. Object #1 has priority 0
  5. Object #2 has priority 0
  6. Object #3 has priority 0

什么是成功的行为的原因,我应该怎么改变这里才能使我的优先事项工作?

解决方法

当你这样做:
  1. var objs = new[] { 1,3 }.Select(i => new ObjectWithPriority() { Id = i });

您只是创建一个懒惰的评估迭代器,这不会分配一个数组/列表来存储您项目的ObjectWithPriorty.每次枚举迭代器时,它将重新迭代值,并为每次迭代投射一个ObjectWithPriority,但会丢弃它们.

您想要做的是在通过查询之前实现查询,因此稍后您将修改已分配的列表/数组.这可以使用Enumerable.ToList或Enumerable.ToArray来实现:

  1. public static IEnumerable<ObjectWithPriority> CreateObjectsWithPriorities()
  2. {
  3. var objs = new[] { 1,3 }.Select(i => new ObjectWithPriority() { Id = i })
  4. .ToList();
  5. ApplyPriorities(objs);
  6. return objs;
  7. }

您可以额外使用Enumerable.Range而不是分配一个固定大小的数组,这将按照要求懒洋洋地投影数字:

  1. var objs = Enumerable.Range(1,3).Select(i => new ObjectWithPriority { Id = i })
  2. .ToList();

猜你在找的C#相关文章