我正在尝试做一件我认为是“去交叉”的事情(我不确定正确的名称是什么,但这是EpicGames的Tim Sweeney在旧的UnrealEd中所说的)
// foo and bar have some identical elements (given a case-insensitive match)
List‹string› foo = GetFoo();
List‹string› bar = GetBar();
// remove non matches
foo = foo.Where(x => bar.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
bar = bar.Where(x => foo.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
然后,稍后我会执行另一个操作,从原始列表中减去结果以查看我删除了哪些元素。使用 .Except() 很快,所以没有问题。
肯定有更快的方法来做这件事,因为这种方法对于每个列表都有大约30,000个字符串元素时表现很差。最好是能够一次完成此步骤和稍后的步骤的方法。我尝试过使用 .Exists() 替代 .Contains(),但速度略慢。我感觉有点笨,但我认为通过使用 .Except() 和 .Intersect() 和/或 .Union() 的某种组合应该是可能的。