gpt4 book ai didi

c# - 无法更新通用列表的内容

转载 作者:行者123 更新时间:2023-11-30 13:51:32 25 4
gpt4 key购买 nike

我有一个具有 bool 字段的简单类:

public struct Foo { bool isAvailable; }

现在我有一个 foos 列表:

List < Foo >  list = new List< Foo >();

稍后我枚举列表中的每个 foo 并尝试更新其 isAvailable 字段:

foreach(Foo foo in list) {
foo.isAvailable = true;
}

但是上面的代码永远不会更新列表。我在这里做错了什么,补救措施是什么。

最佳答案

这是因为 Foo 是一个可变结构。

当您从列表中获取值时,它正在制作一个副本 - 因为这就是值类型的行为方式。您正在更改副本,而原始值保持不变。

建议:

  • 你可能应该使用一个类
  • 不要创建可变结构。它们的行为方式可能难以预测,或者至少不是您未明确考虑时可能预期的方式。

虽然您可以更改代码以不同方式遍历列表并每次都替换值,但这样做通常不是一个好主意。只需使用一个类...或将您的列表投影到具有适当值的列表。


原始答案,当 Foo 是一个类时

它应该可以正常工作。例如,这是一个简短但完整的程序,它可以工作:

using System.Collections.Generic;

public class Foo
{
public bool IsAvailable { get; set; }
public string Name { get; set; }

public override string ToString()
{
return Name + ": " + IsAvailable;
}
}

class Test
{
static void Main()
{
List<Foo> list = new List<Foo>()
{
new Foo { Name = "First", IsAvailable = true },
new Foo { Name = "Second", IsAvailable = false },
new Foo { Name = "Third", IsAvailable = false },
};

Console.WriteLine("Before:");
list.ForEach(Console.WriteLine);
Console.WriteLine();

foreach (Foo foo in list)
{
foo.IsAvailable = true;
}

Console.WriteLine("After:");
list.ForEach(Console.WriteLine);
}
}

尝试将您当前的代码调整为一个类似的简短但完整的程序,但该程序无法运行,发布它,我们可以弄清楚发生了什么。

关于c# - 无法更新通用列表的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4346076/

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