我有IEnumerable activeContents需要更新一个元素。 但是当我试图把它放回去时(activeContents = cm;)它没有工作我得到了相同的列表。
我该如何解决这个问题?
ContentModel ActiveContent = contentToAction;
List<ContentModel> cm = activeContents.ToList();
cm.Remove(ActiveContent);
ActiveContent.seq = seq;
cm.Add(ActiveContent);
activeContents = null;
activeContents = cm;
activeContents = activeContents.OrderBy(con => con.seq);
我在这里阅读了一些文章,但没有找到解决方法。
答案 0 :(得分:2)
此代码的上下文是什么?您是否将activeContents
作为参数传递?另外,ContentModel
的声明是什么?这是值类型(struct)还是引用类型(class)?
如果ContentModel
是一个类,那么你不需要添加和删除元素来更改seq
属性(我希望这是一个属性......公共字段是icky:p)。只需找到列表中的元素并更改已存在的元素即可。如果contentAction
值实际上已经是列表中的实例,那就更好了。
对于较大的问题,根据您提供的信息很少,代码看起来可能是这样的:
void SomeMethod()
{
// These are initialized somehow:
IEnumerable<ContentModel> activeContents = ... ;
ContentModel contentToAction = ... ;
int seq = ... ;
UpdateSequence(activeContents, contentToAction, seq);
}
void UpdateSequence(IEnumerable<ContentModel> activeContents,
ContentModel activeContents, int seq)
{
ContentModel ActiveContent = contentToAction;
List<ContentModel> cm = activeContents.ToList();
cm.Remove(ActiveContent);
ActiveContent.seq = seq;
cm.Add(ActiveContent);
activeContents = null; // superfluous in any case
activeContents = cm; // ditto here
activeContents = activeContents.OrderBy(con => con.seq);
}
如果是这种情况,那么为了解决您的问题,您的代码看起来应该更像这样:
void SomeMethod()
{
// These are initialized somehow:
IEnumerable<ContentModel> activeContents = ... ;
ContentModel contentToAction = ... ;
int seq = ... ;
UpdateSequence(activeContents, contentToAction, seq);
}
IEnumerable<ContentModel> UpdateSequence(IEnumerable<ContentModel> activeContents,
ContentModel contentToAction, int seq)
{
List<ContentModel> cm = activeContents.ToList();
cm.Remove(contentToAction);
contentToAction.seq = seq;
cm.Add(contentToAction);
return cm.OrderBy(con => con.seq).ToList();
}
以上假设ContentModel
是一个结构。如果它是一个类,并且保证contentToAction
对象已经在activeContents
列表中,那么这个版本也可以工作:
IEnumerable<ContentModel> UpdateSequence(IEnumerable<ContentModel> activeContents,
ContentModel contentToAction, int seq)
{
contentToAction.seq = seq;
return activeContents.OrderBy(con => con.seq).ToList();
}
最后,我要指出,如果activeContents
通常被存储为List<T>
,那么将其视为IEnumerable<T>
只会受到伤害。如果是这种情况,您也可以利用其List<T>
性质并对其进行排序。