使用C#和LINQ比较两个大的字符串列表的最佳方法是什么?

14

我有一个很大的列表(约 110,000个字符串),需要与一个类似大小的列表进行比较。

列表A来自1个系统。 列表B来自一个SQL表格(我只能读取,没有存储过程等)

找到在列表A中存在但在列表B中不存在的值,最好的方法是什么?

处理100,000个字符串是否太多了?

谢谢


当你说列表b来自SQL表时,这是否意味着列表b已加载到内存中,还是类似于SQL Reader数据集,只能一次看到一个项目? - kemiller2002
你是否在使用 Linq to SQL 来处理列表 b? - Erik Forbes
我正在使用TableAdapter,因此SQL表数据(List B)在内存中。 我将List A读入ArrayList中,但可以使用List<string>。 - Donaldinio
顺序重要吗?也就是说,我们知道两个列表的顺序相同,但是列表B可能会有一些缺失吗?列表B是否可能包含不在列表A中的项目?如果您可以将问题限制为具有良好属性的列表,则有优化此操作的方法。 - Eric Lippert
只要我能看到在列表A中有什么内容不在列表B中,顺序并不重要。 - Donaldinio
假设列表A是“X,Y,Z”。列表B可以是“Z,X”吗?还是它总是“X,Z” - 也就是说,相同的项,相同的顺序,但缺少一些?如果您知道两个列表按相同顺序排列,则更容易检测长列表中缺少的项。 - Eric Lippert
5个回答

26

假设你有以下两个列表:

List<string> listA;
List<string> listB;

然后使用Enumerable.Except方法:

List<string> except = listA.Except(listB).ToList();
请注意,如果你想忽略大小写:
List<string> except = listA.Except(listB, StringComparer.OrdinalIgnoreCase).ToList();

您可以将最后一个参数替换为您选择的IEqualityComparer<string>


9

使用 LINQ:

var missing = listA.Except(listB).ToList();

不错。类似于这个:http://msdn.microsoft.com/en-us/library/bb397894.aspx我不太习惯处理大数据集,这种方式可以轻松处理10万条数据吗? - Donaldinio
当然;如果不是这样,你将不得不在数据库上工作,所以C#也无法使用;-p - Marc Gravell

6

想了解一下,你是否必须使用List<string>?因为在.NET 3.5 SP1中,你可以使用HashSet和它的ExceptWith方法。据我所知,HashSets是专门为两个集合之间的比较进行了优化。


不用List<string>,我会看看HashSet。谢谢! - Donaldinio

2
List<string> A = //get from file
List<string> B = //get from db

var C = A.Except(B);

1

这个问题中借鉴,看起来你可以使用Except<T>()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接