linq Except() 方法的意外行为
本文关键字:意外 方法 Except linq | 更新日期: 2023-09-27 17:57:00
class Program
{
static void Main(string[] args)
{
List<string> aList = new List<string>();
List<string> bList = new List<string>();
List<string> answerList = new List<string>();
aList.Add("and");
aList.Add("and");
aList.Add("AND");
aList.Add("And");
aList.Add("not");
aList.Add("noT");
bList.Add("NOt");
answerList = aList.Except(bList, StringComparer.InvariantCultureIgnoreCase).ToList();
foreach (var word in answerList)
{
Console.WriteLine(word);
}
}
上述程序的预期行为是删除 aList 中所有出现的"not"并返回 {and, and, AND, And}。似乎"StringComparer.InvariantCultureIgnoreCase"已经删除了单词"and"的所有重复项,并在answerList中只返回了一次出现的{and}。
这是我直觉上期望的结果。
except 返回集合差值,并且您明确声明要使用不区分大小写的比较。
来自Except()
的文档(强调我的):
通过使用默认相等比较器比较值来生成两个序列的集合差值。
因此,Except()
返回一个集合,这意味着它最多返回每个字符串一次。既然你告诉它应该忽略大小写,你就会得到你得到的输出。
要解决此问题,请使用不对集合进行操作的方法,例如 Where()
:
answerList = aList.Where(
a => !blist.Contains(a, StringComparer.InvariantCultureIgnoreCase))
.ToList();
这种方法很慢(O(a ·b)) 与 Except()
(O(a + b)) 相比,但这对于短序列来说应该不是问题。