C#linq IEnumerable更新项

时间:2014-11-09 19:05:36

标签: c# linq ienumerable

我有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);

我在这里阅读了一些文章,但没有找到解决方法。

1 个答案:

答案 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>性质并对其进行排序。