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中只返回了一次{和}。
答案 0 :(得分:3)
这是我直觉所期望的结果。
除了返回设置差异外,您明确声明要使用不区分大小写的比较。
答案 1 :(得分:1)
来自the documentation of Except()
(强调我的):
使用默认的相等比较器比较值,生成两个序列的设置差异。
因此,Except()
会返回集,这意味着它最多只返回一次字符串。而且,既然你告诉它应该忽略这个案例,你就得到了你得到的输出。
要解决此问题,请使用不对集合进行操作的方法,例如Where()
:
answerList = aList.Where(
a => !blist.Contains(a, StringComparer.InvariantCultureIgnoreCase))
.ToList();
与Except()
(O( a + <)相比,这种方法很慢(O( a · b )) em> b )),但这不应该是短序列的问题。