2008-11-15 23 views
1

让我们先从下面的代码片段:更改项目直通方法

Foreach(Record item in RecordList){ 
    .. 
    item = UpdateRecord(item, 5); 
    .. 
} 

的UpdateRecode功能改变了项目的一些领域,并返回改变的对象。在这种情况下,编译器会抛出一个异常,表示该项无法在每次迭代中更新。

现在UpdateRecord方法改变,使其返回void和片段是这样的:

Foreach(Record item in RecordList){ 
    .. 
    UpdateRecord(item, 5); 
    .. 
} 

在这种情况下,该项目将被更新,因为记录是引用类型。但它使代码不可读。

我正在做的项目有很多foreach循环,而且代码一遍又一遍,所以我想创建更新记录部分的方法。有没有一个很好的方法来做到这一点?使代码更具可读性,而不是进一步摧毁它的一种方法?

回答

1

如果您需要更新集合,请不要使用迭代器模式,就像您说的那样,它可能会出错或出现错误。

我发现在这种情况下使用for循环的索引更清晰一些,因为它非常明显地表明你想要这样做。

+0

谢谢,我认为这是在我的情况下唯一正确的方法。 – Sorskoot 2008-11-15 15:53:25

+1

使用迭代器模式更新集合中的项目绝对没有错。迭代时,您不想在集合中添加或删除项目,这就是编译器所抱怨的。 – 2008-11-15 17:39:40

0

是否需要更新相同的列表?你可以返回一个新的(更新)枚举吗?

foreach(Record item in RecordList){ 
    .. 
    yield return GetUpdatedRecord(item, 5); 
    .. 
} 
1

编译器抱怨,你不能更新收集,不予备案。通过执行item = UpdateRecord,您将重新分配迭代器变量项目。

我不同意UpdateRecord(item,5)以任何方式无法读取 - 但如果它让你感觉好一些,扩展方法可能会使它更清晰地表明你正在改变项目的内容。

static void Update(this Record item, int value) { 
    // do logic 
} 

foreach (Record item in RecordList) { 
    item.Update(5); 
}