我在我正在研究的.NET项目中注意到了这个功能。
private static void RemoveAllElements(ref List<int> listToBeRemoved)
{
foreach (var i in listToBeRemoved)
{
listToBeRemoved.Remove(i);
}
}
这是从列表中删除所有元素的最快方法吗?我也注意到这个函数没有捕获任何异常。我应该改变吗?这是现有的代码。
答案 0 :(得分:44)
我不明白为什么你不能简单地将其简化为
listToBeRemoved.Clear();
您可以查看MSDN Documentation了解更多详情。
我认为您不需要添加任何异常处理逻辑。 Clear
方法在内部使用Array.Clear
,它作为Success和WillNotCorruptState的可靠性契约。我无法想象这会引发异常。
答案 1 :(得分:8)
list.Clear()
请参阅文档:http://msdn.microsoft.com/en-us/library/dwb5h52a.aspx
更改您枚举的集合会使枚举器无效,因此这是非常糟糕的做法。请参阅List.GetEnumerator上的评论:
只要收集仍然存在,枚举器仍然有效 不变。如果对集合进行了更改,例如添加, 修改或删除元素,枚举器是不可恢复的 无效,其行为未定义。
Clear
方法本身不会抛出异常,但如果listToBeRemoved
为null
,您将获得NullReferenceException
。
答案 2 :(得分:5)
为什么不:
listToBeRemoved.Clear();
答案 3 :(得分:3)
内置的Clear
方法呢?
您的RemoveAllElements
方法不仅完全不必要 - 它甚至不起作用!
运行以下代码将生成InvalidOperationException
消息“集合已被修改;枚举操作可能无法执行。”
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list.RemoveAllElements();
答案 4 :(得分:2)
最快捷的方式是listToBeRemoved.Clear()
。
此方法也没有理由使用ref
,因为它对参数引用没有任何作用(仅对参数引用的列表)。您可能无法使用现有代码更改此内容,因为删除ref
需要在呼叫位置进行更改。
答案 5 :(得分:-1)
static void Main (){
List<string> words = new List<string>();
words.AddRange(new[] { "banana", "plum", "peach" });
condition = words.Count;
for (int i = 0; i < condition; i++) words.RemoveAt(0);}
//it returns empty list
答案 6 :(得分:-1)
static void Main ()
{
List<string> words = new List<string>();
words.AddRange(new[] { "banana", "plum", "peach" });
words.RemoveAll(s=>s.Any());//This code returns empty list
}