我想从c#中的列表中删除所有空值,我想知道什么会更有效,为什么?
选项#1:
myList.RemoveAll(item => item == null);
选项#2:
myList = myList.Where(x => x != null).ToList();
谢谢!
这两种方法在其语义上非常不同:
- 第一种方法是"破坏性的",从某种意义上说
myList
,而 - 第二种方法是"无损",因为创建了新的
List
。您的代码还丢弃了原件,但不需要。
删除元素的两种方式都具有O(n)时间复杂性。第二种方法需要创建新的List
,而第一种方式可能需要复制列表的"尾巴"。总体而言,当您保留的项目数与您丢弃的项目数量相似时,您应该看到相似的性能。
第一种方法是一个明确的赢家时,一个情况是所有项目都是非零件的,在这种情况下,该方法不执行复制或重新分配。如果您希望大多数时候搜索null
会失败,请使用第一种方法。
我会说第一个。主要是由于两个原因。
- 更容易阅读。
- 您不必致电
.ToList()
。基本上,您正在创建一个新列表,这会花费大量资源。