Skip to main content
 首页 » 编程设计

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

2024年01月11日30dflying

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