如何从C#中的List <T>中删除一个对象并返回被删除的对象?

use*_*422 2 .net c# list

如何从List<T>C#中删除对象并返回删除的对象?

是否RemoveAt会破坏物体?我是否需要首先制作对象的深层副本然后调用RemoveAt

Dav*_*ier 11

RemoveAt不会破坏对象,也不需要深层副本.

var result = list[i];
list.RemoveAt(i);
return result;
Run Code Online (Sandbox Code Playgroud)

RemoveAt是O(n - i)vs Remove是O(n)(其中n是长度,i是要去除的元素的索引).删除元素后,必须将其后的所有元素都移除.

根据此文档,如果您想要以最高效的方式删除元素,请将其与last,element交换,然后将其删除.这不保持如上所述的顺序.从理论上讲,这意味着删除列表的最后一个元素是O(1).

var result = list[i];
list[i] = list[list.Length-1];
list.RemoveAt(list.Length-1);
return result;
Run Code Online (Sandbox Code Playgroud)

  • 这是(一点点)比另一个答案更好.(1)使用索引符号"[i]`比通过Linq扩展方法`.ElementAt(i)`更简洁直接.(2)`RemoveAt(i)`比`Remove(valueInList)`快得多,因为它不必搜索`List <>`来找到要删除的匹配项. (5认同)

Dar*_*ren 7

你可以这样做:

var listObject = list.ElementAt(index);

list.Remove(listObject);
Run Code Online (Sandbox Code Playgroud)

  • @JeppeStigNielsen即使在这种情况下也会制作一个副本,所以净效果是相同的 - 你仍然可以返回一个可用的对象,它与你刚从列表中"删除"的内容相匹配.但是,仍然是一个好点,是我们的假设. (3认同)