【问题标题】:How to empty a list in C#?如何在 C# 中清空列表?
【发布时间】:2011-03-15 11:36:47
【问题描述】:

我想清空一个列表。该怎么做?

【问题讨论】:

  • 这里的响应时间比阅读/搜索MSDN要快
  • 加上现在在这里比 MSDN 更容易找到答案。
  • 更不用说如果你谷歌.net empty list,这个页面出现在之前 MSDN!
  • @V4Vendetta 在 2018 年,我建议 StackOverflow 可能应该创建一个机器人,将您的评论放在 cmets 中具有 MSDN 文档链接的任何线程上......

标签: c# .net


【解决方案1】:

真的很简单:

myList.Clear();

【讨论】:

  • ...如果列表实际上是List<>ArrayList,或者实现了IList。 ;)
  • @Lucero 如果两者都不是,它会被称为列表吗?
  • 由于这是谷歌的热门话题并且我遇到了这个问题,我正在对此发表评论。如果您在循环中使用同一个列表并使用 clear,则该列表通常会保留对旧对象的引用 - 我经常最终使用 = new LisT();由于它会立即清除所有旧分配。不过对于大多数人来说,.Clear();就足够了,但如果你发现一个列表表现得很奇怪 - 尝试使用 = new List();.
  • 我将加倍 necrocomment 对此的评论,因为截至 2020 年已在此处提供了一些错误信息。List<T>.Clear 正确清除所有引用,从而允许 GC 在必要时清除分配。 new List<T> 不会这样做,并且实际上不适用于所有场景
【解决方案2】:

如果“列表”是指List<T>,那么Clear 方法就是您想要的:

List<string> list = ...;
...
list.Clear();

你应该养成在这些东西上搜索 MSDN 文档的习惯。

以下是如何快速搜索有关该类型的各种位的文档:

所有这些 Google 查询都列出了一组链接,但通常您希望 Google 在每种情况下都为您提供第一个链接。

【讨论】:

  • “所有这些都列出了一组链接,但通常你想要第一个。”除非你想清空列表?
  • 对不起,我应该更清楚。您通常需要 Google 为您提供的第一个链接,而不是“列表类”。
【解决方案3】:

选项#1:使用Clear() 函数清空List&lt;T&gt; 并保留其容量。

  • Count 设置为 0,并且从元素中引用其他对象 该系列也已发布。

  • 容量保持不变。

选项 #2 - 使用 Clear()TrimExcess() 函数将 List&lt;T&gt; 设置为初始状态。

  • Count 设置为 0,并且从元素中引用其他对象 该系列也已发布。

  • 修剪一个空的List&lt;T&gt; 将列表的容量设置为 默认容量。

定义

Count = List&lt;T&gt; 中实际存在的元素数

Capacity = 内部数据结构无需调整大小即可容纳的元素总数。

仅清除()

List<string> dinosaurs = new List<string>();    
dinosaurs.Add("Compsognathus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);

Clear() 和 TrimExcess()

List<string> dinosaurs = new List<string>();
dinosaurs.Add("Triceratops");
dinosaurs.Add("Stegosaurus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
dinosaurs.TrimExcess();
Console.WriteLine("\nClear() and TrimExcess()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);

【讨论】:

    【解决方案4】:

    给出一个替代答案(谁需要 5 个相同的答案?):

    list.Add(5); 
    // list contains at least one element now
    list = new List<int>();
    // list in "list" is empty now
    

    请记住,尚未清除对旧列表的所有其他引用(根据具体情况,这可能是您想要的)。此外,在性能方面,它通常会慢一些。

    【讨论】:

    • 你能验证设置 list = new List() 实际上比 list.Clear(); 慢吗?根据 MSDN(下面的链接) list.Clear();是一个 O(N) 操作,我无法想象实例化一个新列表会花费比这更长的时间。 msdn.microsoft.com/en-us/library/dwb5h52a(v=vs.110).aspx
    • DotNetPerls 做了一个基准测试,发现 new List 更快。 dotnetperls.com/list-clear
    • 通过扩展,还要注意list 有一个新的引用。因此,如果您在该列表上使用锁,请不要使用它。
    • @GerhardPowell 根据您提供的文章,与使用 Clear() 方法相比,创建一个新的 List 不再更快了。 In the results, calling Clear() on the List was faster.
    • Clear() 将手动清除列表(O(n)),new List 将删除对旧列表的引用并让 GC 清除旧列表(显然也是 O(n)) .因此,在需要垃圾收集之前,新列表的实例化似乎更快 - 在这种情况下,重用旧列表(带有清除)变得更加有效。
    【解决方案5】:

    你可以这样做

    var list = new List<string>();
    list.Clear();
    

    【讨论】:

      【解决方案6】:

      你可以使用clear方法

      List<string> test = new List<string>();
      test.Clear();
      

      【讨论】:

        【解决方案7】:

        你需要列表中的 Clear() 函数,就像这样。

        List<object> myList = new List<object>();
        
        myList.Add(new object()); // Add something to the list
        
        myList.Clear() // Our list is now empty
        

        【讨论】:

          猜你喜欢
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 2015-05-17
          • 2017-09-08
          • 2021-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多