2016-04-04 16 views
0

Bir liste için .remove ve .removeAll uzantılarının nasıl kullanılacağı konusunda burada birkaç örnek aramıştım. Bu çalışmayı yapmaya çalışırken, bir Listeden istediğim şekilde bir öğeyi gerçekten kaldırmak için .removeAll'ı almada sorun yaşıyorum. Yaptığı şey, Listede her değerin bir kopyasını tutmaktır.C# öğeleri yinelenen bir Listeye kaldırarak ve ekleyerek mi?

Döngü, 'k' tarafından açıklanan bir değerler kümesinde yineleniyor. İstediğim şey, 'k' değeri, Listede ZOR DEĞİLDİR, listeden tamamen kaldırmak istiyorum. Eğer listede 'K' değeri bulunmuyorsa, onu eklemek istiyorum.

  for(double k=Low[0]; k<=High[0]; k +=TickSize) 
      { 
       if(LiTZ.Contains(k)) { //if k is in list 
        LiTZ.RemoveAll(item => item == k); //remove it 
       } 
       else { 
        LiTZ.Add(k); //if k not in list, add it 
       } 
      } 

Ben de şöyle birinci listeden öğe silme nasılsa ayrı bir liste oluşturma ve deyim 'eğer' ilk o listeye ekleyerek, daha sonra karşılaştırma ve düşündüm:

   for(double k=Low[0]; k<=High[0]; k +=TickSize) 
       { 
        if(LiTZ.Contains(k)) { //if k is in list 
         LiRemovalList.Add(k); //List of items to remove later 
        } 
        else { 
         LiTZ.Add(k); //if k not in list, add it 
        } 
       } 
       //Code to compare and remove items in LiRemovalList from LiTZ 

Diğer Listeleri oluşturmaya gerek kalmadan, bir Listede doğrudan listelemem mümkün mü?

cevap

0

Değil. Bir foreach döngüsüyle veya döngü için bir artışla yinelenen bir koleksiyonu değiştiremezsiniz, çünkü bir öğe kaldırıldıktan sonra numaralandırma işlemi başarısız olur.

Sen şöyle döngü için geriye doğru kullanarak öğeleri kaldırabilirsiniz:

for (int i = LiTZ.Count - 1; i >= 0; i--) { 
    if (LiTZ[i] == something) { 
    LiTZ.RemoveAt(i); 
    } 
} 

Ama muhtemelen en iyi seçim burada yeni bir liste oluşturarak olurdu için.

İlgili konular