删除所有不工作的元素

时间:2011-11-08 15:27:40

标签: c# list collections

我在我正在研究的.NET项目中注意到了这个功能。

    private static void RemoveAllElements(ref List<int> listToBeRemoved)
    {
        foreach (var i in listToBeRemoved)
        {
            listToBeRemoved.Remove(i);
        }
    }

这是从列表中删除所有元素的最快方法吗?我也注意到这个函数没有捕获任何异常。我应该改变吗?这是现有的代码。

7 个答案:

答案 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方法本身不会抛出异常,但如果listToBeRemovednull,您将获得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
 }