Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IOrderedEnumerable上枚举时设置属性不会在集合中的对象上设置属性_C#_Linq - Fatal编程技术网

C# 在IOrderedEnumerable上枚举时设置属性不会在集合中的对象上设置属性

C# 在IOrderedEnumerable上枚举时设置属性不会在集合中的对象上设置属性,c#,linq,C#,Linq,我在这里有点不知所措。我正在使用LINQs.Select从另一个集合创建对象集合,然后使用.OrderBy获取IORDerenumerable。这部分工作正常,但当我使用foreach循环此部分并在集合中的对象上设置属性时,集合中的对象不会被修改 我正在VS2008/.NET3.5SP1中编写和运行 下面是一些示例代码,它再现了在LINQPad中编写和测试的问题,但其行为与在VS中相同: void Main() { IOrderedEnumerable<MyClass> ob

我在这里有点不知所措。我正在使用LINQs.Select从另一个集合创建对象集合,然后使用.OrderBy获取IORDerenumerable。这部分工作正常,但当我使用foreach循环此部分并在集合中的对象上设置属性时,集合中的对象不会被修改

我正在VS2008/.NET3.5SP1中编写和运行

下面是一些示例代码,它再现了在LINQPad中编写和测试的问题,但其行为与在VS中相同:

void Main()
{
    IOrderedEnumerable<MyClass> objects = Enumerable.Range(0, 10)
            .Select(n => new MyClass(n))
            .OrderBy(o => o.ObjectNumber);

    foreach (MyClass obj in objects)
    {
        obj.MyProperty = true;
    }

    var trueObjs = objects.Where(o => o.MyProperty);

    if (trueObjs.Count() == 0)
    {
        Debug.WriteLine("No object in 'objects' has MyProperty == true");
    }
    else
    {
        Debug.WriteLine("Found");
    }
}

public class MyClass
{
    public MyClass(int objectNumber)
    {
        ObjectNumber = objectNumber;
        MyProperty = false;
    }

    public int ObjectNumber { get; private set; }
    public bool MyProperty { get; set; }
}

如果有任何关于我在这里做错了什么的提示,我将不胜感激。

您将运行两次枚举,一次使用第一个foreach,但另一次使用trueObjs.Count。假设枚举调用了新的MyClassn,那么第二轮将得到一组新的对象

快速修复:将第一行更改为:

var objects = Enumerable.Range(0, 10)
        .Select(n => new MyClass(n))
        .OrderBy(o => o.ObjectNumber)
        .ToList();

谢谢,我会在8分钟内标记为已回答,所以不会让我更快。我认为每个枚举在第一次被引用时只运行一次,然后缓存。有什么方法可以防止枚举在后续引用上再次运行?我认为ToList不会返回IOrderedEnumerable。