比较两个List <customobject>的最快方法

时间:2016-12-24 03:02:02

标签: c# list mono

我有两个List<CustomObject>,名为list1和list2

public class CustomObject
{
    public string foo { get; set; }
    public string bar{ get; set; }
}

目标是生成一个新列表,其中包含已在list2中修改/添加的所有条目。

因为这些列表可能会很长,所以不能选择循环它们......

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一种传统的方法:

public class CustomObject : IComparable
{
    public string foo { get; set; }
    public string bar{ get; set; }
    public int CompareTo(CustomObject o)
    {
         if (this.foo == o.foo && this.bar == o.bar) return 0;

         //We have to code for the < and > comparisons too.  Could get painful if there are a lot of properties to compare.
         if (this.Foo == o.Foo) return (this.Bar.CompareTo(o.Bar));
         return this.Foo.CompareTo(o.Foo);
    }
}

然后使用Linq.Except

listA.Except(listB)

答案 1 :(得分:1)

添加另一个答案以容纳评论中出现的一些额外NFR:

  1. 可以通过哈希码识别对象
  2. 列表非常大,因此性能问题
  3. 我们的想法是将旧列表与新列表进行比较,以查看是否已弹出任何新的哈希码。
  4. 您需要将对象存储在字典中:

    var list = new Dictionary<string, CustomObject>();
    

    添加时,请提供哈希作为密钥:

    list.Add(customObject.Hash, customObject);
    

    要扫描新的:

    var difference = new List<CustomObject>();
    foreach (customObject o in newList)
    {
        if (oldList.ContainsKey(o.Hash)) difference.Add(o);
    }
    Log(String.Format("{0} new hashes found.", difference.Count));
    

    通过使用Dictionary,您可以利用密钥存储在哈希表中的方式。在哈希表中查找项目比仅仅执行扫描更快。比较一下。我相信这将是O(n * log(n))而不是O(n ^ 2)。