哪个是更好的性能明智:几个类似列表的联合,或者在一个包含大量重复项的真正重要列表中有所区别?

bor*_*ica 1 c# linq

一点点背景:

我正在制作一个小应用程序来演示LINQ的使用,所以我应该使用大多数LINQ方法.该应用程序将显示有关电影和电视节目的一些信息,并根据过滤器提出建议.

我做了三节课:TvShow,Season和Episode.TvShow包含季节和季节列表包含情节列表.剧集包含其演员列表,该剧集是该剧集的演员.我想在类TvShow中创建一个方法,该方法根据个别剧集的演员列表返回完整的演员列表.

我决定使用Union或Distinct,但我不确定哪种方法的性能更好,因为我认为这是在这个例子中选择一个而不是另一个的唯一原因(我知道性能不是真正的问题)应用程序这么小,但我想知道这将如何在更大的范围内表现).

以下是两种方法:

    public List<Actor> AllCast()
    {
        List<Actor> actors = new List<Actor>();
        foreach (Season s in seasons)
        {
            s.Episodes.ForEach(e => actors.AddRange(e.Cast));
        }
        return actors.Distinct().ToList();
    }
Run Code Online (Sandbox Code Playgroud)

要么

    public List<Actor> AllCast()
    {
        List<Actor> actors = new List<Actor>();
        foreach(Season s in seasons)
        {
            s.Episodes.ForEach(e => actors.AddRange(actors.Union(e.Cast)));
        }
        return actors;
    }
Run Code Online (Sandbox Code Playgroud)

我所拥有的想法是:最好是继续将几个列表添加到一个大列表然后浏览那个巨大的列表并仅返回不同的值或者更好地通过一个小的和一个增长的列表并比较值到找到一个联合(我假设Union是如何找到它的结果),然后将它添加到一个已经唯一的列表中?

PS我知道HashSet,但我真的很想在这里使用LINQ,因为这是我项目的目的.

Jon*_*eet 7

你的第二种方法需要在内部HashSet为每个赛季建立一个新的方法,将那个赛季的演员与我们之前见过的所有演员进行比较 - 我希望这比对所有演员进行一次传球要慢一些,把它们放到一个设定以获得独特性.

我会SelectMany在LINQ中使用两次来实现它:

public List<Actor> AllCast() =>
    seasons                         // All seasons
       .SelectMany(s => s.Episodes) // All episodes as a flat sequence
       .SelectMany(e => e.Cast)     // All actors as a flat sequence
       .Distinct()                  // Distinct
       .ToList(); 
Run Code Online (Sandbox Code Playgroud)