我需要访问IEnumerable.Distinct大O表示法 的渐近时间和空间复杂度
所以我在看扩展方法的实现,Enumerable.Distinct我看到它是使用和内部类实现的Set<T>,这几乎是一个带有"开放寻址"的哈希表的经典实现
很快引起注意的是,很多代码Set<T>只是一个复制粘贴HashSet<T>,有一些遗漏
但是,这种简化的Set<T>实现有一些明显的缺陷,例如Resize不使用素数作为插槽大小的方法,就像HashSet<T>看到的那样,请参阅HashHelpers.ExpandPrime
所以,我的问题是:
System.CoreHashSet<T>会表现得更好,所以我应该避免使用Distinct扩展方法,并编写我自己的扩展方法,HashSet<T>而不是使用Set<T>?一点点背景:
我正在制作一个小应用程序来演示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,因为这是我项目的目的.