2009-03-21 3 views
5

Может кто-нибудь объяснить, почему это не работает, как мне кажется.Enumerable.Except Problem

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 
*/ 

Что бы я ожидал, это 2, 2.1, 2.3, 2.3, 2.3, 2.4, 2.5. Почему бы не вернуть отчетный список? Это ошибка?

Update:

Хорошо, полностью пропустил этот момент в документации. Забавные 4 человека отвечают тем же самым ответом. Вы могли бы подумать, что вы просто попросите парня, который ответил на него первым. :)

+0

@James: Я добавил способ делать то, что вы хотите, кстати, что, по-моему, для вас более полезно, чем «нет, это не так». ;) –

+0

Большое спасибо. Я собирался спросить об этом, но ты тоже избил меня. Ни в коем случае не давайте лишних очков, но спасибо. –

+0

Все в порядке. Мой друг только сделал меня пирожными, так что я набит! ;) –

ответ

8

Зачем возвращать отдельный список? Это ошибка?

Nope. Except производит разница в настройках. См. documentation:

Производит заданное различие двух последовательностей, используя сопоставитель по умолчанию для сравнения значений.

Чтобы сделать то, что вы хотите, просто используйте Where, чтобы отфильтровать значения соответствующим образом. Например:

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

Это на самом деле правильное поведение. Метод Except документирован, чтобы вернуть значение разности двух аргументов IEnumerable. Поскольку по определению множества не могут содержать повторяющиеся элементы, они исключаются в результате. См. MSDN docs для получения дополнительной информации.

1

Поскольку «За исключением» - это «заданная» функция, а понятие «набор» определяется как уникальный список элементов. Другими словами, множества по определению не могут содержать дубликатов.