簡體   English   中英

哪個是更好的性能明智的選擇:合並多個相似的列表,還是在一個包含大量重復項的非常大的列表中區分?

[英]Which is better performance wise: Union of several similar lists, or Distinct on a really big list with lots of duplicates?

背景知識:

我正在制作一個小型應用程序來演示LINQ的用法,因此我應該主要使用LINQ方法。 該應用將顯示有關電影和電視節目的一些信息,並根據過濾器提出建議。

我上了三節課:電視節目,季節和情節。 電視節目包含季節列表,季節包含情節列表。 劇集包含其演員列表,即該劇集的演員。 我想在類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();
    }

要么

    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;
    }

我的想法確實是:最好繼續將幾個列表添加到一個大列表中,然后遍歷該巨大列表並僅返回不同的值,還是最好查看一個小的又一個不斷增長的列表並將值進行比較?找到一個聯合(我想這是聯合會找到其結果的方式),然后將其添加到一個已經唯一的列表中?

PS我知道HashSet,但是我真的很想在這里使用LINQ,因為那是我項目的目的。

您的第二種方法是為每個季節在內部建立一個新的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(); 

由於使用LINQ是您項目的一部分,所以為什么不使用這種純LINQ方法:

public List<Actor> AllCast()
{
    List<Actor> actors = seasons
        .SelectMany(season => season.Episodes.SelectMany(episode => episode.Cast))
        .Distinct()
        .ToList();
    return actors;
}

我猜這也是最有效的方法之一。 它將所有包含的對象展平為一個大序列,然后僅使用Distinct (使用一組)。 一種非LINQ的方法是嵌套foreach循環,該循環將actor添加到HashSet<Actor> ,然后調用set.ToList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM