C# 为什么除了函数应用不同?

C# 为什么除了函数应用不同?,c#,C#,可能重复: 我有两个列表像 lstOne = { "A", "B", "C" ,"C" ,"C" }; lstTwo = { "A" }; lstResult = lstOne.Except(lstTwo).ToList(); 现在预期的输出是 lstReult = { "B","C","C","C" }; 但是actula的结果是 lstResult = { "B","C" }; 为什么会这样?我使用了Except,为什么它也应用了Distinct?“Except”作为返回两个序列的

可能重复:

我有两个
列表

lstOne = { "A", "B", "C" ,"C" ,"C" };
lstTwo = { "A" };

lstResult = lstOne.Except(lstTwo).ToList();
现在预期的输出是

lstReult = { "B","C","C","C" };
但是actula的结果是

lstResult = { "B","C" };
为什么会这样?我使用了
Except
,为什么它也应用了
Distinct

“Except”作为返回两个序列的设置差

根据定义,集合差异是一个集合。按定义设置的集合没有重复项

预期输出为

否,预期输出与实际输出相同

如果您期望的是不同的东西,我的建议是调整您的期望以匹配记录的行为。

这就像返回“一个序列,其中包含两个序列元素的设置差异。”。集合没有重复项

这可能是一个微妙的点,但它的功能符合规范

如果需要DUP:

var lstOne = new[] { "A", "B", "C" ,"C" ,"C" };
var except = new HashSet<string> { "A" };

var lstResult = lstOne.Where(x => !except.Contains(x)).ToList();
   // ^^ "B", "C", "C", "C"
var lstOne=new[]{“A”、“B”、“C”、“C”、“C”};
var except=newhashset{“A”};
var lstreult=lstOne.Where(x=>!except.Contains(x)).ToList();
//"B,"C,"C,"C

:“通过使用默认的相等比较器来比较值,生成两个序列的集差。”-->difference as set-->每个键都是唯一的。

我第一次遇到这种行为时发现它相当令人惊讶。也许这个方法的名称可以更好。理解“集合差异”需要有足够的数学背景来知道集合不包含重复的元素。浏览一下文档,你很容易就会忽略它所说的是集合,而不是序列。我会明确指出,它通过指定类似“返回第一个序列中不属于第二个序列的所有不同元素”的内容来返回不同的元素@CodeInChaos:Good point。下次我见到文档经理时,我会向他提到这一点。使用哈希集将删除重复项。如果你在检查,比如说,{“C”,“C”},你会如何处理这个问题?@Mike首先定义你所说的{“C”,“C”}是什么意思——在集合论方面,这与{“C”}是相同的。如果你的意思是“两个
”C“
”,那么你需要定义你的意思是相邻的(即有序的序列),还是只是按计数。不确定相邻或计数等等。然而,我有一个需要,使用上面的例子,第一个列表带有{“a”、“B”、“C”、“C”},并且删除了{“C”、“C”},我需要只剩下{“a”、“B”、“C”}。对第二个列表使用HashSet将使我得到{“a”、“B”、“C”、“C”}。而且,为了使事情变得更复杂,我需要在复杂类型上而不是字符串上执行此操作。希望这能更好地解释问题。