有效地消除C#中的字符串子集

时间:2017-10-13 00:33:20

标签: c# string performance

我有一组独特的字符串(数千)和另一组更大的独特字符串(超过一百万)。字符串在两个集合中的长度大致相同(低于10个字符,它是用作id的字符串)。我需要从较小的集合中消除字符串的子集,只保留较大集合中存在的字符串。换句话说,如果这个字符串存在于较大的集合中,我将其保存在较小的集合中,否则我需要将其从较小的集合中删除。 两个集合的容器可以是任何类型(C#),也可以只是简单的数组。问题是:我需要使用最强高效(按时间)方式从较小的容器中删除较大容器中不存在的字符串。

1 个答案:

答案 0 :(得分:3)

Linq是显而易见的选择,只需使用

var list = smallList.Intersect(bigList).ToList();

另外,如果你想看看它是如何完成的,也许可以看一下Jon Skeets博客实现Intersect。

https://codeblog.jonskeet.uk/2010/12/30/reimplementing-linq-to-objects-part-16-intersect-and-build-fiddling/

实施例

 var random = new Random();
 var bigList = Enumerable.Range(1, 1000000).Select(n => n.ToString());
 var smallList = Enumerable.Range(1, 1000000)
       .OrderBy(i => random.Next())
       .Take(1000)
       .Select(i => (i*2).ToString());

 var stopwatch = new Stopwatch();
 stopwatch.Start();

 var list = smallList.Intersect(bigList).ToList();

 stopwatch.Stop();

 Console.WriteLine($"{list.Count()} in {stopwatch.ElapsedMilliseconds}ms");

enter image description here