2010-06-29 51 views
1

我在这里有点遗憾。我使用LINQ创建另一个集合中的对象集合。选择然后使用.OrderBy获取IOrderedEnumerable。这部分工作正常,但是当我用foreach循环并在集合中的对象上设置属性时,集合中的对象不会被修改。枚举IOrderedEnumerable <>时设置属性不会设置集合中对象的属性

我在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; } 
} 

我真的很欣赏的,我做错了任何提示这里。

回答

2

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

快速修复:更改第一行:

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

谢谢,我会标记为在8分钟内(SO不会让我更早)回答。 我认为每次枚举只会在第一次被引用时运行一次,然后才会被缓存。 有没有办法阻止枚举在后续引用上再次运行? – TheEvilPenguin 2010-06-29 02:20:35

+0

没关系,没有看到编辑:)谢谢,非常感谢 – TheEvilPenguin 2010-06-29 02:21:58

+0

ToList()不会返回一个IOrderedEnumerable,我想。 – 2010-06-29 02:33:48