是否有更有效的方法来确定两个EntityCollections是否包含相同的元素

本文关键字:是否 元素 两个 EntityCollections 包含相 有效 方法 | 更新日期: 2023-09-27 18:04:20

我需要确定两个EntityCollections是否相等。我有代码,我认为会做的伎俩,但我想知道是否可能有一个更有效的算法?注意,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();
        }
    }

是否有更有效的方法来确定两个EntityCollections是否包含相同的元素

首先,如果你的集合可能每个只包含10个元素,那么担心这个算法的效率可能为时过早,除非你在关键路径中调用它很多次。但是你可以尝试的一件事是使用交集和任何扩展来代替。

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();

我很确定您每次都会通过主循环(. all)遍历数组。如果您使用linq对它们进行排序(顺序),那么您可以循环遍历一个列表并将该项与另一个列表中相同索引处的项进行比较。事实上,您可以在遇到差异时立即返回false