我有一个大的值列表(100-200 个字符串),我需要返回它们的不同列表。使用 .NET 最有效的方法是什么?我能想到的两种方法是:
- 使用 IEnumerable 类的 Distinct() 方法
- 使用字典
如果字典方法在原始方面更快,请考虑围绕代码的可维护性做出权衡决定。
我有一个大的值列表(100-200 个字符串),我需要返回它们的不同列表。使用 .NET 最有效的方法是什么?我能想到的两种方法是:
如果字典方法在原始方面更快,请考虑围绕代码的可维护性做出权衡决定。
Enumerable.Distinct
如果你只做一次,我希望它和使用字典一样快。如果您希望能够添加/删除值并保持独特性,您可以构建一个HashSet<string>
(这基本上是我期望 Distinct 在幕后所做的,但Distinct()
显然会在找到它们时返回新值,保持顺序。
实际上,只需使用:
HashSet<string> distinctItems = new HashSet<string>(list);
如果您不介意顺序混乱,这将是一个非常好的(且简单)的解决方案。它比使用 a 更简单Dictionary
,并且在概念上也更简洁(因为您真的不想将键映射到值)。
(与以往一样,我建议首先找到最易读的解决方案,并对其进行基准测试——如果它“足够快”,那就去吧。如果你想将它用作另一个查询的一部分,那么Distinct
很可能是最易读的方式。否则,我会建议HashSet
。)
我个人会使用 LINQ 提供的 Distinct() 方法。它更容易阅读和维护。虽然使用 LINQ 会比使用字典慢,但差异会很小(在您列出的情况下),您最好花时间优化数据库查询或 Web 服务调用。
我建议你在这里使用分析。生成一个包含示例项目的列表,使用两种方式对其进行排序 1M 次,并测量每种方式使用的时间。
如果可读性是一个问题,请创建一个GetDistinctItems
方法并将您的代码放入其中:voilà,自我记录的代码。