【问题标题】:Move elements in list移动列表中的元素
【发布时间】:2013-01-31 15:02:19
【问题描述】:

我声明以下对象

List<string> list = {"Kate", "John", "Paul", "Eve", "Hugo"};

我想将“Eve”移到我的列表前面?我怎样才能做到这一点。我不能重新排序其他元素!
在输出我想得到这个

"Eve", "Kate", "John", "Paul", "Hugo"

【问题讨论】:

    标签: c# .net list data-structures


    【解决方案1】:
    list.Remove("Eve");  // Removes the first "Eve" element in the list
    list.Insert(0, "Eve");  // Inserts "Eve" at the first position in the list
    

    但是,如果您的列表包含多个“Eve”,则调用 Remove("Eve") 只会删除第一次出现的“Eve”。

    而且您必须知道在列表开头插入元素是一项昂贵的操作。因为列表中已经存在的所有元素都必须移动。

    更新

    正如@AlvinWong 评论的那样,LinkedList&lt;string&gt; 是一个很好的解决方案,可以在插入元素时避免这种开销。 Insert 操作在 O(1) 中完成(List 中的 O(n-i))。 LinkedList&lt;string&gt; 的主要缺点是访问 ith 元素是 O(i) 中的操作(List 中的 O(1))。

    【讨论】:

    • 这是一种可能的解决方案,但请注意,插入一个元素需要将其余元素向前移动一个,这是一项相当昂贵的操作。
    • 另外,如果您计划将条目移动到列表中的某个位置稍后,以说明在最初删除条目时索引如何移动。 (在这种情况下可能更容易添加/复制然后删除)
    • 另外,如果您打算频繁移动元素,LinkedList&lt;T&gt; 可能更合适。
    【解决方案2】:

    您可以使用List.RemoveAt(这样您就不会删除所有 Eve)和List.Insert

    【讨论】:

    • RemoveAt 在您知道"Eve" 的索引时很有用。加快进程。
    【解决方案3】:

    您可以将其删除并插入到第一个索引。

    List<string> list = new List<string>(){ "Kate", "John", "Paul", "Eve", "Hugo" };
    list.Remove("Eve");
    list.Insert(0, "Eve");
    foreach (var i in list)
    {
       Console.WriteLine(i);
    }
    

    如果您知道"Eve" 的具体索引,您可以使用List.RemoveAt() 方法将其删除。

    这是DEMO

    【讨论】:

      【解决方案4】:

      您可以使用 RemoveAt 方法从给定索引中删除 Eve,并使用 Insert 将 Eve 添加到列表的开头。

      【讨论】:

        【解决方案5】:
        list.Remove("Eve");
        list.Insert(0, "Eve");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-30
          • 2020-10-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多