我有一组独特的字符串(数千)和另一组更大的独特字符串(超过一百万)。字符串在两个集合中的长度大致相同(低于10个字符,它是用作id的字符串)。我需要从较小的集合中消除字符串的子集,只保留较大集合中存在的字符串。换句话说,如果这个字符串存在于较大的集合中,我将其保存在较小的集合中,否则我需要将其从较小的集合中删除。 两个集合的容器可以是任何类型(C#),也可以只是简单的数组。问题是:我需要使用最强高效(按时间)方式从较小的容器中删除较大容器中不存在的字符串。
答案 0 :(得分:3)
Linq是显而易见的选择,只需使用
var list = smallList.Intersect(bigList).ToList();
另外,如果你想看看它是如何完成的,也许可以看一下Jon Skeets博客实现Intersect。
实施例
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");