我有两个List<CustomObject>
,名为list1和list2
public class CustomObject
{
public string foo { get; set; }
public string bar{ get; set; }
}
目标是生成一个新列表,其中包含已在list2中修改/添加的所有条目。
因为这些列表可能会很长,所以不能选择循环它们......
有什么想法吗?
答案 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:
您需要将对象存储在字典中:
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)。