如何解决LINQ:比较两个列表
我正在使用 LINQ 查询来比较两个列表(流派和匹配),以查看 matching
是否包含 genres
的任何元素。
查询:
IEnumerable<FilmeSerienGenre> genres =
from g in _db.FilmeSerienGenres
where g.FgGenreNavigation.GBez.Contains(txt)
select g;
IEnumerable<FilmeSerien> matching =
from fs in FSList
where fs.FilmeSerienGenres
.Any(fsg => genres
.Any(g => g == fsg))
select fs;
但是,运行此代码时我没有得到任何结果,因为 where fs.FilmeSerienGenres.Any(fsg => genres.Any(g => g == fsg))
返回 false
。我做错了什么?
编辑:
where fs.FilmeSerienGenres
.Any(fsg => genres
.Any(g => g.FgFs == fsg.FgFs && g.FgGenre == fsg.FgGenre))
FgFs
和 FgGenre
属性都是 int
。
我把g
和fsg
之间的比较换成了两个Properties,还是不行,所以我觉得不是'=='和'.Equals()'的问题。
解决方法
通常情况下,如果您向我们提供要求,对我们来说会更容易。现在,您给我们提供了不起作用的代码,并要求我们给您提供了有效的代码,而没有告诉我们您想要什么。
无论如何,在我看来您有两个表:一个 FSList
和一个 FilmeSerienGenres
序列。
FSList 和 FilmeSerienGenres 之间似乎存在一对多的关系:FSList 中的每个 FS
都有零或 FilmeSerienGenres。每个 FilmeSerienGenre 都只属于一个 FS,即外键所指的 FS。
每个 FilmeSerienGenres 在 g.FgGenreNavigation.GBez
中都有一个字符串序列。
要求: 给定一个字符串 Txt
,从 FSList 中的所有 FS 中给我,那些 FS,至少有一个 FilmeSerienGenre,至少有一个
Filmeg.FgGenreNavigation.GBez 等于 TXT。
或者简单地说:FSList 是一系列电影和系列。它们中的每一个都属于零个或多个类型:喜剧、动作、惊悚等。您可以在 FS.FilmeSerienGenres 中看到这一点。你想要那些至少有一个与 Txt 匹配的 FilmeSerienGenre 的电影和系列。 Filmeg.FgGenreNavigation.GBez
与 Thriller、Action 等类似,我不会感到惊讶。
您的问题是,因为每个 FS 都有一个子列表 FilmeSerienGenres,每个子列表都有一个子列表流派.Filmeg.FgGenreNavigation.GBez。
每当您有一个“子列表列表”,并且想要将它们全部连接成一个大列表时,请考虑使用 Queryable.SelectMany
的重载之一string txt = ...
var matchingFilmsAndSeries = FSList
.Where(fs => fs.FilmeSerienGenres
.SelectMany(genre => genre.Filmeg.FgGenreNavigation.GBez)
.Contains(txt));
换句话说:从 FSList 中的每个 fs,制作一个包含所有 Filmeg.FgGenreNavigation.GBez 所有 FilmeSerienGenres 的大序列。
结果是一个字符串序列。如果这个大序列至少有一个等于 txt
的值,那么保留 FS。如果txt不在序列中,不要保留FS。
== 绝对是你的问题。但是,尚不清楚您在比较什么。如果它们是类,== 的默认实现将比较类的哈希值。因此,他们必须在两个列表中共享该数据的相同实例才能正常工作。
相反,我会专注于特定的原始属性,这些属性必须使双方都相等。或者你必须在两种类型上实现 IEquatable ,然后使用 .Equals() (而不是 ==)以便它调用你的接口方法。您也可以直接覆盖 ==,但这应该始终是最后的手段,因为它不是类型安全的,并且将来可能会打破其他开发者的期望。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。