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))

FgFsFgGenre 属性都是 int

我把gfsg间的比较换成了两个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() (而不是 ==)以便它调用你的接口方法。您也可以直接覆盖 ==,但这应该始终是最后的手段,因为它不是类型安全的,并且将来可能会打破其他开发者的期望。