【问题标题】:Making arraylist distinct使arraylist与众不同
【发布时间】:2011-05-18 17:55:37
【问题描述】:

我的数组列表中有重复项,并希望删除这些重复项以使其与众不同。我尝试使用 hastable 摆脱重复,但它破坏了订单。如何在不更改插入顺序的情况下使其与众不同?

【问题讨论】:

  • 我们所说的收藏有多大?
  • @Sebastian,这个问题是 Java。

标签: c# arraylist


【解决方案1】:

怎么样:

using System.Linq;

myArrayList = new ArrayList(myArrayList.Distinct().ToArray());

var myArray = myArrayList.Distinct().ToArray();

【讨论】:

  • ArrayList 不接受IEnumerable<T>。您需要在Distinct() 之后添加ToArray()。也就是说,List<T>ArrayList 更可取,尽管这是 OP 的当前集合。
  • 我通常不使用 ArrayLists,我使用的集合通常接收和 IEnumberable 到它们的构造函数。如果是这种情况,并且您想要一个 ArrayList 而不是 Array(如我的第二个示例),那么您可能必须一个一个地复制这些值(除非它具有 .AddRange() 方法)。
  • 感谢您提供的信息,但您不能在 arralist 上使用 Distinct()。我必须将我的数组列表转换为数组,然后使用 distinct,然后将其转换回数组列表。不过,在你的帮助下,我能够到达那里。谢谢!
【解决方案2】:

Hashtable 听起来确实是个好主意。

foreach object in the ArrayList:
if (object in hashtable)
{
   remove object from ArrayList. (instead of object you can use object's hash)
   // (notice, the ArrayList's indexes will change after you remove!)
}
else
{
   insert object to Hashtable.  (instead of object you can use object's hash)
}

运行后,您将只有每个对象的第一个实例。

请注意,您不必使用 HashTable,即使是另一个 ArrayList 也足够了。尽管如此,我还是会使用 hashtable,因为在平均情况下,hashtable 中的搜索/插入是 O(1),而 arraylist 中的二进制搜索是 O(log(n))。

【讨论】:

  • 如果它们是重复的,第一个或最后一个实例将是无关紧要的
  • @Angelo,我想我不太明白你的评论......显然,如果有重复,那么重复的实例之一是无关紧要的,但你需要找到它才能删除它。 ..
【解决方案3】:

塞巴斯蒂安是对的。从技术上讲,如果您想避免重复,请使用不支持重复的集合。使用 Hashtable,遍历 ArrayList 并将它们弹出到其中。如果所有代码都是你的,看看你是否可以重构,以便你不使用 ArrayList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2015-09-08
    • 2012-07-02
    • 2013-02-04
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多