我对C#有很多了解,但是这一个让我感到困惑,Google并没有提供帮助。为什么在枚举对象上设置属性不起作用?
我有一个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<SubItem> items)
{
Console.WriteLine(string.Join(", ", items.Select(item => item.MagicNumber.ToString()).ToArray()));
}
public class SubItem
{
public string Name;
public int MagicNumber;
}
#停止哪些方面C1的被输出我的“MagicNumber = 42”的变化?有没有办法让我的变化“坚持”,而不做一些时髦的转换到列表<>或数组?
谢谢! -Mike
是+1。对于原始问题中定义的`items`,每次`items`被迭代时,创建新的`SubItem`实例。 '.First()`迭代一次,`Write`第二次迭代它。这样做的另一个结果是(item`仍然和原始问题一样)`items.First()== items.First()`评估为`false`。 – 2013-01-28 15:50:06