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

c# – IEnumerable – 更新foreach循环内的对象,第1张

概述我有一个非常简单的程序,创建一堆对象,并通过它们迭代来设置每个对象的Priority属性. static void Main(string[] args){ foreach (var obj in ObjectCreator.CreateObjectsWithPriorities()) Console.WriteLine(String.Format("Object #{0 我有一个非常简单的程序,创建一堆对象,并通过它们迭代来设置每个对象的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();
总结

以上是内存溢出为你收集整理的c# – IEnumerable – 更新foreach循环内的对象全部内容,希望文章能够帮你解决c# – IEnumerable – 更新foreach循环内的对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1262882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存