它不是最漂亮的实现,但你可以做到这一点的最快方法是:
var tempA = new HashSet<int>(inputA.Select(item => item.Id));
var tempB = new HashSet<int>(inputB.Select(item => item.Id));
var resultA = new List<Category>(inputA.Count);
var resultB = new List<Category>(inputB.Count);
foreach (var value in inputA)
if (tempB.Contains(value.Id))
resultA.Add(value);
foreach (var value in inputB)
if (!tempA.Contains(value.Id))
resultB.Add(value);
resultA.TrimExcess();
resultB.TrimExcess();
// and if needed:
inputA = resultA;
inputB = resultB;
如果您需要超过item.id独特然后用一个新的记录,如:
inputA.Select(item => new Tuple<int, string>(item.Id, item.Title));
另一种选择是在你的类类重写.GetHashCode如:
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
var typedObj = obj as Category;
if (typedObj == null)
return false;
return Title == typedObj.Title && Id == typedObj.Id && Rank == typedObj.Rank;
}
你试过'.Except()'扩展方法吗? – 2014-09-19 08:55:38
我试过,但是,问题是我不使用对象的所有属性,它不工作。可以选择要比较的属性? – Julien698 2014-09-19 09:06:20
Except()方法可以采用必须实现的IEqualityComparer(http://msdn.microsoft.com/zh-cn/library/vstudio/ms132151%28v=vs.100%29.aspx)。它应该执行你想要的比较。 – 2014-09-19 09:09:56