我在这里有点不知所措。我正在使用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; }
}
我真的很感激有关我在这里做错的任何提示。
答案 0 :(得分:2)
您正在运行枚举两次,一次使用第一个foreach
,但再次使用trueObjs.Count()
。鉴于枚举调用了new MyClass(n)
,你最终会得到一组新的对象。
快速修复:将第一行更改为:
var objects = Enumerable.Range(0, 10)
.Select(n => new MyClass(n))
.OrderBy(o => o.ObjectNumber)
.ToList();