有没有更有效的方法来确定两个实体集合是否包含相同的元素?

时间:2011-08-03 19:53:21

标签: c# linq entity-framework

我需要确定两个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();
        }
    }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

首先,如果你的集合可能只包含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();