在特定元素之前添加元素到列表中。

6

我有一个包含100个元素的列表,需要在符合我的条件的现有元素前添加另一个元素。什么是最快速、性能最优化的方法?例如:

foreach (var i in myList)
{
    if (myList[i].value == "myValue")
    {
        myList[i-1] add ("someOtherValue")
    }
}

也许我应该使用其他容器?
5个回答

14

首先,您可以使用FindIndex方法查找您的项目的索引:

var index = myList.FindIndex(x => x.value == "myvalue");

然后在正确的位置插入

myList.Insert(index,newItem);

请注意,在给定索引处插入会将其他所有内容向前推进(考虑在索引0处查找您的项目)。

2
但是如果条件是集合的一个元素呢?换句话说,“myvalue”是List<conditions>的一个元素吗?如果我使用foreach循环将“myList”中的所有值与“conditions”的所有元素进行比较,那么会出现错误吗? - kul_mi

5

考虑使用LinkedList<T>。它的优点是插入或删除项不需要移动任何项。缺点是无法随机访问项目。您必须从第一个或最后一个项目开始遍历列表才能访问项目。


3
myList.Insert(myList.IndexOf("myValue") - 1, "someOtherValue");

在使用前,请先检查myvalue是否存在,并且它不在索引0处。


假设这是 List<string>,并且 OP 的项具有 value 属性,这意味着它是自定义类型。 - Jamiec
@Jamiec 标题说是列表,标签也说是列表。OP甚至没有声称代码是有效的。 - Erix

3
int index = myList.IndexOf("myValue");
if (index >= 0)
  myList.Insert(index, "myNewValue");

顺便提一下,使用for-each进行迭代时,不应修改自己的集合或列表(如上述代码中所示)。

如果你这样做,我认为它会抛出一个运行时异常。评论点赞加一。 - Erix
如果存在多个myValue变量,那该怎么办? - Fattie
根据问题而定 - 如果元素应该在第一次出现该项之前插入还是在所有出现的位置都插入。有不同的IndexOf方法可以找到所有出现的位置。在插入时,需要每次将索引增加1。 - Matthias

1
我猜测这个列表是一个数组 - 如果是这样的话,您是否尝试使用Linq来处理呢?
string[] mylist = new string[100];
// init the list
List<string> list = keys.ToList();
list.Insert(1,"somethingelse");
mylist = list.ToArray(); // convert back to array if required

如果一开始就是一个列表(List),你可以跳过转换步骤,直接使用Insert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接