Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有更有效的方法来确定两个EntityCollection是否包含相同的元素?_C#_Linq_Entity Framework - Fatal编程技术网

C# 有没有更有效的方法来确定两个EntityCollection是否包含相同的元素?

C# 有没有更有效的方法来确定两个EntityCollection是否包含相同的元素?,c#,linq,entity-framework,C#,Linq,Entity Framework,我需要确定两个EntityCollection是否相等。我有一些代码,我认为可以做到这一点,但我想知道是否有更有效的算法?注意,EntityCollections可能每个元素少于10个 private static bool isEquivalent( EntityCollection<MyClassDetails> myClassDetails1, EntityCollection<MyClassDetails> myClassD

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

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

我很确定你每次都会通过主循环遍历数组。全部。如果您使用linq按orderby对它们进行排序,那么您可以在一个列表中循环,并将该项与另一个列表中相同索引处的项进行比较。事实上,一旦出现差异,您可能会立即返回false。

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

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

这不确定两个集合的交集是否为空吗?这不确定两个集合的交集是否为空吗?这是一个很好的观点。如果我可以在两个集合上都使用服务器OrderBy DetailID,那么我可以在发现差异后立即返回。否,All方法将在第一次失败后停止迭代。让服务器对列表进行排序是否会提高包含的性能?这是一个很好的观点。如果我可以在两个集合上使用服务器OrderBy DetailID,那么我可以在发现差异后立即返回。不,All方法将在第一次失败后停止迭代。让服务器对列表排序是否会提高包含的性能?我确实喜欢此解决方案,这可能是@dlev的评论所指的。我认为它的效率会降低,因为它总是迭代所有元素,但是对于我期望的少量元素,它可能不会成为问题。在失败的情况下,这不应该迭代每个元素。如果从InterestTects返回单个项,则Any将立即停止,它将不会继续迭代。另外,在返回之前,intersects不需要完全迭代。这就是共同例程的力量。我确实喜欢这个解决方案,这可能就是@dlev的评论所暗示的。我认为它的效率会降低,因为它总是迭代所有元素,但是对于我期望的少量元素,它可能不会成为问题。在失败的情况下,这不应该迭代每个元素。如果从InterestTects返回单个项,则Any将立即停止,它将不会继续迭代。另外,在返回之前,intersects不需要完全迭代。这就是共同例行程序的力量。