我需要确定两个 EntityCollection 是否相等。我有我认为可以解决问题的代码,但我想知道是否有更有效的算法?请注意,每个 EntityCollections 的元素可能少于 10 个。
private static bool isEquivalent(
EntityCollection<MyClassDetails> myClassDetails1,
EntityCollection<MyClassDetails> myClassDetails2 )
{
var myClassComparer = new MyClassComparer();
return
myClassDetails1.All(
myClassDetail1 =>
myClassDetails2.Contains(
myClassDetail1, myClassComparer ) );
}
class MyClassComparer : IEqualityComparer<MyClassDetails>
{
public bool Equals( MyClassDetails details1, MyClassDetails details2 )
{
return details1.DetailID == details2.DetailID;
}
public int GetHashCode( MyClassDetails obj )
{
return obj.GetHashCode();
}
}
请您参考如下方法:
首先,如果您的集合可能每个只包含 10 个元素,那么担心此算法的效率可能为时过早,除非您在关键路径中多次调用它。但是您可以尝试的一件事是改用 Intersects 和 Any 扩展。
return !myClassDetails1.Intersects(myClassDetails2, new MyClassComparer()).Any();
我不确定它的效率会提高多少,但代码会更漂亮。此外,在过去,我已经为这种情况创建了一个 FuncComparer。
class FuncComparer<T> : IEqualityComparer<T>
{
private Func<bool, T, T> compare;
public FuncComparer(Func<boo, T, T> compare){
this.compare = compare;
}
public bool Equals(T left, T right) {
return this.compare(left, right);
}
}
// usage
return !items1
.Intersects(items2, new FuncComparer<Item>((l, r) => l.Id == r.Id))
.Any();
