2011-05-20 14 views
13

Hangi durumda System.Collections.Generic.List öğesinde başarıyla kaldırılmayacak? http://msdn.microsoft.com/en-us/library/cd666k3e.aspx itibarenHangi durumda System.Collections.Generic.List öğesinde başarıyla kaldırılmayacak?

:

gerçek öğesi başarıyla kaldırılırsa; Aksi halde, . List (Of T) öğesinde öğe bulunmadıysa, bu yöntem da false değerini döndürür.

bana o (T) Listesinde bulunan bir öğe üzerinde bir Kaldır operasyonu aslında dolayısıyla bu soruyu başarısız olması mümkün olduğunu düşündürüyor yolu onlar öbek.

+1

aşırı bulanık olduğu nasıl başka bir şey başarısız olabilir ... İyi soru :) – Jaymz

cevap

5

Reflector'da System.Collections.Generic.List kaynağına bakıldığında, koleksiyonda bulunmayan öğenin gerçekten tek yol olduğu ortaya çıkıyor Remove false değerini döndürmek için. reflektör ile yukarıda

int index = this.IndexOf(item); 
if (index >= 0) 
{ 
    this.RemoveAt(index); 
    return true; 
} 
return false; 
4

Evet, listede olmayan bir öğeyi kaldırmaya çalışıyorsanız, başarısızlık olarak sınıflandırılır ve hiçbir şeyin kaldırılmadığını göstermek için false değerini döndürür.

Eğer bir şey gerçekten kaldırılmışsa başka bir kod yapmak istiyorsanız, bu yararlı olabilir.

Güncelleme: Eğer sınıfınız IEquality'i kullanıyorsa ve bu bir istisna atarsa, kod geri dönüşü sağlamadığı için atışın gerçekleşmesini sağlar.

Yansıtılan kaynağı gönderen başkalarıyla birlikte, yanlış bir öğe yalnızca bir öğe bulamadığında döndürülür.

Güncelleme: diğer insanların kaynağına daha fazla. IndexOf yöntem zincirine bakarsanız, bunun eşitliğe düştüğünü ve özel bir şey yapmadığını göreceksiniz.

List.Remove:

public bool Remove(T item) 
{ 
    int num = this.IndexOf(item); 
    if (num >= 0) 
    { 
     this.RemoveAt(num); 
     return true; 
    } 
    return false; 
} 

List.IndexOf:

public int IndexOf(T item) 
{ 
    return Array.IndexOf<T>(this._items, item, 0, this._size); 
} 

Array.indexOf:

public static int IndexOf<T>(T[] array, T value, int startIndex, int count) 
{ 
    if (array == null) 
    { 
     throw new ArgumentNullException("array"); 
    } 
    if (startIndex < 0 || startIndex > array.Length) 
    { 
     throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index")); 
    } 
    if (count < 0 || count > array.Length - startIndex) 
    { 
     throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count")); 
    } 
    return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count); 
} 

EqualityComparer.IndexOf:

internal virtual int IndexOf(T[] array, T value, int startIndex, int count) 
{ 
    int num = startIndex + count; 
    for (int i = startIndex; i < num; i++) 
    { 
     if (this.Equals(array[i], value)) 
     { 
      return i; 
     } 
    } 
    return -1; 
} 

ILSpy'den gelen tüm kodlar, Red Gate'e teşekkürler :-)

+6

Öğe listede bulunmadıysa, ** ** yanı sıra başarıyla kaldırılmadıysa, MSDN dokümanı yanlış döndürdüğünü belirtir ... – Jaymz

+0

+ Istisnaları belirtmek için 1 – sehe

4
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")] 
public bool Remove(T item) 
{ 
    int index = this.IndexOf(item); 
    if (index >= 0) 
    { 
     this.RemoveAt(index); 
     return true; 
    } 
    return false; 
} 

kod. Koleksiyonda olmasa sadece kaldırılmaz. Bir belge/dil uyuşmazlığı tahmin ediyorum.

karşılaştırma için Mono Kaynak kodunda
İlgili konular