C# 可枚举。问题除外

C# 可枚举。问题除外,c#,linq,C#,Linq,有人能解释一下为什么我认为它不能正常工作吗 double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.3, 2.3, 2.4, 2.5 }; double[] numbers2 = { 2.2 }; IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2); foreach (double number in onlyInFirstSet) Console.WriteLine

有人能解释一下为什么我认为它不能正常工作吗

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

/*
 This code produces the following output:

 2
 2.1
 2.3
 2.4
 2.5
*/
double[]numbers1={2.0,2.1,2.2,2.3,2.3,2.4,2.5};
双[]数字2={2.2};
IEnumerable only yinFirstSet=numbers1.Exception(numbers2);
foreach(仅在第一组中为双倍数字)
控制台写入线(编号);
/*
此代码生成以下输出:
2.
2.1
2.3
2.4
2.5
*/
我所期望的是2,2.1,2.3,2.3,2.3,2.4,2.5。为什么要返回一个不同的列表?这是虫子吗

更新:

好吧,文件中完全没有提到这一点。有趣的是,有4个人回答了同样的问题。你会认为你会投票给第一个回答问题的人。:)

为什么要返回一个不同的列表?这是虫子吗

没有<代码>除外产生设置差异。见:

通过使用默认相等比较器比较值,生成两个序列的集合差

要执行所需操作,只需使用
Where
对值进行适当过滤。例如:

"abcdddefffg".Where(e => !"cde".Contains(e));       // Produces "abfffg".

这实际上是正确的行为。
Except
方法用于返回两个IEnumerable参数的集差。因为根据定义,集合不能包含重复的元素,所以这些元素在结果中被消除。有关更多信息,请参阅。

,因为“除外”是一个“集合”函数,“集合”的概念定义为一个唯一的项目列表。换句话说,根据定义,集合不能包含重复项。

@James:顺便说一句,我添加了一种做你想做的事情的方法,我想这可能比“不,它不是那样做的”对你更有用非常感谢你。我本来打算下一步问的,但你也打了我一顿。没有办法给你额外的布朗尼点数,但谢谢你,没关系。我的朋友刚给我做了布朗尼,所以我吃饱了请阅读著名的博客,了解
Enumerable.Except()
方法的内部结构。