2010-12-20 20 views
10

sadece sonunda biz bilmiyorduk Enumerable.Except yöntemi hakkında bir şey olduğu ortaya çıktı bizim kodunda bir hata ayıklama bir saatten fazla geçirmiş olması konusunda: daha genelEnumerable.Except neden DISTINCT öğeleri döndürüyor?

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = Enumerable.Empty<int>(); 
ilist.Except(ilist2); // returns { 1 } as opposed to { 1, 1, 1, 1 } 

ya:

var ilist3 = new[] { 1 }; 
var ilist4 = new[] { 1, 1, 2, 2, 3 }; 
ilist4.Except(ilist3); // returns { 2, 3 } as opposed to { 2, 2, 3 } 

MSDN sayfasından baktığımızda:

Bu yöntem ikinci görünmeyen, ilk bu öğeleri döndürür. , saniyede ilk olarak görünmeyen öğeleri de döndürmez.

Ben böyle durumlarda olsun: İlk dizideki her elemanın ikinci 'görünür' ve bu nedenle kaldırılması gerektiğini, çünkü

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = new[] { 1 }; 
ilist.Except(ilist2); // returns an empty array 

boş bir dizi döner.

Ancak, neden yalnızca ikinci dizide görünmeyen tüm diğer öğelerin ayrı örneklerini alıyoruz? Bu davranışın ardındaki mantık nedir?

+0

içindedir

:

A Set bu şekilde tarif edilir Bir hata ya da istenmeyen işlevler gibi. MSDN sayfası, farklı bir sonuç hakkında değil diyor ... –

+7

Bu bir hata değil. 'Except' yönteminin ayarlanmış bir işlem olarak tanımlanan SQL' EXCEPT' operatörüne çevrilmesi amaçlanmıştır. Ayarlanmış bir işlem olarak, sadece farklı öğeler döndürülür. "Ayrıcalık", MSDN'in "set" terminolojisini kullanması tarafından ima edilir. – Gabe

cevap

16

Kesinlikle neden böyle yapmaya karar verdiklerini kesinlikle söyleyemem. Ancak, ona bir şans vereceğim.

MSDN bu belirtilenler dışında açıklar:

değerleri karşılaştırmak için varsayılan eşitlik karşılaştırıcısı kullanarak iki dizilerin seti farkını üretir. , Kokan bir dizi bir nesne olarak kabul ayrı nesneler topluluğu, kendi başına Bence

+1

+1, bu mantıklı geliyor. – driis

+2

+1 Uygulama, sorunu O (NxN) - O (N) arasında azaltmak için hashsets kullanmaktadır. – dthorpe

İlgili konular