C# 两组(列表)数据的交集

C# 两组(列表)数据的交集,c#,linq,entity-framework,entity,intersection,C#,Linq,Entity Framework,Entity,Intersection,我有两组数据(复杂对象列表或SQL数据-LINQ to Entities),我试图找到这两组数据的交集。特别是复杂属性“HashData”的交叉点,如下所示: 左侧的集合可能约为10000行,而右侧的集合始终是约100行的子集。我意识到,如果我在存储集合时按“Hashdata”对左边的集合进行排序,使用某种二进制搜索算法进行搜索会快得多,但是由于与问题无关的原因,我不能这样做 较小的数据子集从不存储在SQL中(仅在下面的SQL表中显示,以便于解释)。它在运行时显示在列表中 目前,我正在对数据进

我有两组数据(复杂对象列表或SQL数据-LINQ to Entities),我试图找到这两组数据的交集。特别是复杂属性“HashData”的交叉点,如下所示:

左侧的集合可能约为10000行,而右侧的集合始终是约100行的子集。我意识到,如果我在存储集合时按“Hashdata”对左边的集合进行排序,使用某种二进制搜索算法进行搜索会快得多,但是由于与问题无关的原因,我不能这样做

较小的数据子集从不存储在SQL中(仅在下面的SQL表中显示,以便于解释)。它在运行时显示在
列表中

目前,我正在对数据进行一个可怜的循环,并进行如下匹配(其中,
录制
是100行列表,
ShowData
是10000行列表):

List ShowData=(来自context.ShowDatas中的ShowData
其中(showData.Show.Id==advert.Id)
orderby showData.HashData升序
选择showData).ToList();
foreach(在记录点中显示数据记录){
foreach(ShowData中的ShowData实际值){
if(recording.HashData==actual.HashData){
}
}
}
所以基本上我想做的是:

返回ShowData对象(大集)列表,其中在ShowData中找到任何HashData(来自小集),但在对DB的LINQ to Entity初始查询中

我很接近:

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj)
    {
        IEnumerable<string> bStrs = bObj.Select(b => b.HashData).Distinct();
        return aObj.Join(bStrs, a => a.HashData, b => b, (a, b) => a);
    }
private IEnumerable xyz(列表aObj,列表bObj)
{
IEnumerable bStrs=bObj.Select(b=>b.HashData.Distinct();
返回aObj.Join(bStrs,a=>a.HashData,b=>b,(a,b)=>a);
}

由于您使用的是IEnumerable,因此可以使用Intersect扩展方法而不是Join。如果要返回大集,则需要将大集查询的结果与较小的集相交。您需要编写一个IEquality比较器,如下所示:要比较对象,请调用Intersect扩展方法:

return bStrs.Intersect(aObj, new MyEqualityComparer());

类似的方法可能有效(警告未经测试):

private IEnumerable xyz(列表aObj,列表bObj)
{
返回aObj.Where(sd1=>bObj.Select(sd2=>sd2.HashData).Contains(sd1.HashData));
}

Hi,我在上面尝试了这个方法,但是当我遍历这两个集合并计算匹配项(recording.HashData==actual.HashData)与运行上面的方法时,得到的结果不同:IEnumerable contains=xyz(ShowData,recordingPoints);int returned=contains.Count();这可能是因为您的方法只获取唯一的值(即,如果它已经在返回集中,请不要读取它)。我需要重新阅读它,即使它已经存在,Josh的答案可能会更好地满足您的目的(尽管我不确定Intersect是否也只提供不同的结果)。嗨Josh,我尝试了以下方法:
public bool Equals(ShowData x,ShowData y){//检查比较对象是否引用相同的数据。if(Object.ReferenceEquals(x,y))返回true;//检查比较对象是否为null。if(Object.ReferenceEquals(x,null)| | Object.ReferenceEquals(y,null))return false;//检查产品的属性是否相等。return x.HashData==y.HashData;}
但我不确定这是如何编译的,因为我遇到了一个错误:iEnumerable不包含Intersect@user1112324-您确定已为“System.Linq”和“System.Collections.Generic”包含“using”语句吗?Intersect无疑是IEnumerable的扩展方法。
return bStrs.Intersect(aObj, new MyEqualityComparer());
private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj)
{
    return aObj.Where(sd1 => bObj.Select(sd2 => sd2.HashData).Contains(sd1.HashData));
}