当前位置:  开发笔记 > 编程语言 > 正文

为什么在枚举对象上设置属性不起作用?

如何解决《为什么在枚举对象上设置属性不起作用?》经验,为你挑选了1个好方法。

我对C#了解很多,但是这个让我感到困惑,谷歌没有帮助.

我有一个IEnumerable范围的对象.我想在第一个上设置一个属性.我这样做,但是当我在修改后枚举对象范围时,我看不到我的变化.

这是问题的一个很好的例子:

    public static void GenericCollectionModifier()
    {
        // 1, 2, 3, 4... 10
        var range = Enumerable.Range(1, 10);

        // Convert range into SubItem classes
        var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i});

        Write(items);  // Expect to output 1,2,3,4,5,6,7,8,9,10

        // Make a change
        items.First().MagicNumber = 42;

        Write(items);  // Expect to output 42,2,3,4,5,6,7,8,9,10
        // Actual output: 1,2,3,4,5,6,7,8,9,10
    }

    public static void Write(IEnumerable items)
    {
        Console.WriteLine(string.Join(", ", items.Select(item => item.MagicNumber.ToString()).ToArray()));
    }

    public class SubItem
    {
       public string Name;
       public int MagicNumber;
    }

C#的哪个方面阻止了我的"MagicNumber = 42"输出变化?有没有办法让我的变化"坚持"而不做一些时髦的转换为List <>或数组?

谢谢!-麦克风



1> Simon Steele..:

当你调用First()时,它会枚举这段代码的结果:

Select(i => new SubItem() {Name = "foo", MagicNumber = i});

请注意,Select是一个惰性枚举器,这意味着它只在您从中请求项目时执行选择(并且每次提出时都会执行此选择).结果不存储在任何地方,因此当您调用items.First()时,您将获得一个新SubItem实例.然后,当您将项目传递给Write时,它会获得一大堆新SubItem实例 - 而不是之前获得的实例.

如果要存储选择的结果并对其进行修改,则需要执行以下操作:

var items = range.Select(i => new SubItem() {Name = "foo", MagicNumber = i}).ToList();

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有