比较两个列表的最快方法

时间:2009-01-04 17:16:04

标签: c# collections

我有一个List(Foo),我想看看它是否等于另一个List(foo)。什么是最快的方式?

6 个答案:

答案 0 :(得分:24)

从3.5开始,您可以使用LINQ函数:

List<string> l1 = new List<string> {"Hello", "World","How","Are","You"};
List<string> l2 = new List<string> {"Hello","World","How","Are","You"};
Console.WriteLine(l1.SequenceEqual(l2));

它也知道提供自己的比较器的过载

答案 1 :(得分:13)

以下是我要做的步骤:

  1. 如果为true,则执行object.ReferenceEquals(),然后返回true。
  2. 检查计数,如果不相同,则返回false。
  3. 逐个比较元素。
  4. 以下是该方法的一些建议:

    1. 将实现基于ICollection。这为您提供了计数,但不限于特定的集合类型或包含的类型。
    2. 您可以将该方法实现为ICollection的扩展方法。
    3. 您需要使用.Equals()来比较列表中的元素。

答案 2 :(得分:1)

这样的事情:

public static bool CompareLists(List<int> l1, List<int> l2)
{
    if (l1 == l2) return true;
    if (l1.Count != l2.Count) return false;
    for (int i=0; i<l1.Count; i++)
        if (l1[i] != l2[i]) return false;
    return true;
}

可能需要进行一些额外的错误检查(例如空检查)。

答案 3 :(得分:0)

这样的事情可能会使用Match Action。

public static CompareList<T>(IList<T> obj1, IList<T> obj2, Action<T,T> match)
{
   if (obj1.Count != obj2.Count) return false;
   for (int i = 0; i < obj1.Count; i++)
   {
     if (obj2[i] != null && !match(obj1[i], obj2[i]))
       return false;
   }
}

答案 4 :(得分:0)

假设您想要知道CONTENTS是否相等(而不仅仅是列表的对象引用。)

如果您要比插入更频繁地进行相等性检查,那么您可能会发现每次插入值时生成哈希码更有效,并在进行相等性检查时比较哈希码。请注意,您应该考虑订单是否重要,或者只是列表中的列表具有相同的内容。

除非你经常比较,否则我认为这通常是一种浪费。

答案 5 :(得分:0)

我没有看到的一个捷径是,如果您知道如何创建列表,您可以将它们连接成字符串并直接进行比较。

例如......

在我的情况下,我想提示用户输入单词列表。我想确保每个单词以字母开头,但在此之后,它可能包含字母,数字或下划线。我特别担心用户会使用短划线或以数字开头。

我使用正则表达式将它分成2个列表,然后将它们连接在一起并将它们作为字符串进行比较:

    var testList = userInput.match(/[-|\w]+/g)  
        /*the above catches common errors: 
         using dash or starting with a numeric*/
    listToUse = userInput.match(/[a-zA-Z]\w*/g)

    if (listToUse.join(" ") != testList.join(" ")) {
                return "the lists don't match"

因为我知道两个列表都不包含空格,并且列表只包含简单的字符串,所以我可以将它们与空格连接在一起,并进行比较。