我正在设计一个界面,用户可以在其中将 publicaiton 加入关键字,当他们这样做时,我想建议通常与所选关键字一起出现的其他关键字。诀窍是获得相关频率以及建议关键字的属性。
关键字类型 (EF) 具有以下字段:
int Id
string Text
string UrlString
...以及与 Publications 实体集的多对多关系。
我快到了。和 :
var overlappedKeywords =
selectedKeyword.Publications.SelectMany(p => p.Keywords).ToList();
在这里,我得到了一些非常有用的东西:一个扁平化的关键字列表,每个关键字都在列表中重复,但它与 selectedKeyword 一起出现了很多次。
剩下的挑战:
所以我想计算每个关键字出现在这个列表中的次数,并将不同的关键字实体投影到一种新类型上,称为 KeywordCounts,具有与 Keyword 相同的字段但有一个额外的字段:int PublicationsCount
,我将在其中填充重叠关键字中每个关键字的计数。我怎样才能做到这一点??
到目前为止,我已经尝试了 2 种方法:
var keywordCounts = overlappingKeywords
.Select(oc => new KeywordCount
{
KeywordId = oc.Id,
Text = oc.Text,
UrlString = oc.UrlString,
PublicationsCount = overlappingKeywords.Count(ok2 => ok2.Id == oc.Id)
})
.Distinct();
...PublicationsCount 正在正确填充,但 Distinct 在这里不起作用。(我必须为此创建一个 EqualityComarer 吗?为什么默认的 EqualityComarer 不起作用?)
var keywordCounts = overlappingKeywords
.GroupBy(o => o.Id)
.Select(c => new KeywordCount
{
Id = ???
Text = ???
UrlString = ???
PublicationsCount = ???
})
我对 GroupBy 不是很清楚。我似乎无法访问 Select 中的 'o',并且 c 没有与 Keyword 的任何属性相匹配
更新
我的第一种方法将使用传递给 .Distinct() 的简单 EqualityComparer :
class KeywordEqualityComparer : IEqualityComparer<KeywordCount>
{
public bool Equals(KeywordCount k1, KeywordCount k2)
{
return k1.KeywordId== k2.KeywordId;
}
public int GetHashCode(KeywordCount k)
{
return k.KeywordId.GetHashCode();
}
}
...但是 Slauma 的答案更可取(并且被接受),因为它不需要这个。对于 EF 实体实例的默认 EqualityComparer 是什么,我仍然感到困惑——它不会像我在上面所做的那样根据主要 id 进行比较吗?