gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:00:57 24 4
gpt4 key购买 nike

我有一个非常简单的程序,它创建了一堆对象并遍历它们以设置每个对象的 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.Id, 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, 2, 3 }.Select(i => new ObjectWithPriority() { Id = i });

您只是在创建一个延迟计算的迭代器,这不会分配一个数组/列表来存储您投影的 ObjectWithPriorty。每次枚举迭代器时,它都会再次迭代这些值并为每次迭代转换一个 ObjectWithPriority,但会丢弃它们。

您要做的是在传递查询之前具体化查询,因此稍后您将实际修改已经分配的列表/数组。这可以使用 Enumerable.ToListEnumerable.ToArray 来实现:

public static IEnumerable<ObjectWithPriority> CreateObjectsWithPriorities()
{
var objs = new[] { 1, 2, 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 循环内的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com