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