加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:20:04 所属栏目:百科 来源:网络整理
导读:我有一个非常简单的程序,创建一堆对象,并通过它们迭代来设置每个对象的Priority属性. static void Main(string[] args){ foreach (var obj in ObjectCreator.CreateObjectsWithPriorities()) Console.WriteLine(String.Format("Object #{0} has priority {1}
我有一个非常简单的程序,创建一堆对象,并通过它们迭代来设置每个对象的Priority属性.
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.Priority));
        }
    }
}

class ObjectWithPriority
{
    public int Id { get; set; }
    public int Priority { get; set; }
}

我期待在Main方法中的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

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读