枚举IOrderedEnumerable<>时设置属性不在集合中的对象上设置属性

时间:2010-06-29 02:12:23

标签: c# linq

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

我正在VS2008 / .NET 3.5 SP1中编写和运行。

以下是一些重现问题的示例代码(在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; }
}

我真的很感激有关我在这里做错的任何提示。

1 个答案:

答案 0 :(得分:2)

您正在运行枚举两次,一次使用第一个foreach,但再次使用trueObjs.Count()。鉴于枚举调用了new MyClass(n),你最终会得到一组新的对象。

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

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