2014-12-31 28 views
8

Bazı sayı kümeleri içeren List<int> var. Rastgele, ayrı ayrı işlenecek bir dizin seçiyorum (buna master). Şimdi, bu dizini hariç tutmak ve List'un diğer tüm öğelerini almak istiyorum (köle olarak adlandırın).Listeden bir öğe hariç (Dizine göre) ve diğerlerini de al

var items = new List<int> { 55, 66, 77, 88, 99 }; 
int MasterIndex = new Random().Next(0, items .Count); 

var master = items.Skip(MasterIndex).First(); 

// How to get the other items into another List<int> now? 
/* -- items.Join; 
    -- items.Select; 
    -- items.Except */ 

Join, Select, Except - bunlardan herhangi ve nasıl?

DÜZENLEME: Orijinal listeden herhangi bir öğe kaldırılamıyor, aksi halde iki liste tutmam gerekiyor.

cevap

16

Kullanım Where: -

var result = numbers.Where((v, i) => i != MasterIndex).ToList(); 

Çalışma Fiddle. Listeden Usta öğeyi kaldırmak olabilir

+0

Güzel! Kusursuz çalışıyor. Belgelerin herhangi bir yerinde 'Bu' yeri açık değildi. – Ajay

+0

@Ajay - Dokümantasyon var, Nerede paylaştığım bağlantıyı kontrol edin. –

+2

Evet. Bu zamana kadar, bu yaklaşımı fiili ürün kodunda zaten kullanmıştım (ki bu açıkca ints listesi değil). – Ajay

2

,

List<int> newList = items.RemoveAt(MasterIndex); 

RemoveAt() orijinal listeden öğeyi kaldırır yüzden yeni listeye koleksiyonunu atamak gerekli değildir. RemoveAt() yöntemini çağırdıktan sonra items.Contains(MasterItem), false'u döndürür.

+0

İki liste gerektirir. Orijinali tutmam gerek! – Ajay

+1

@Ajay RemoveAt() öğeyi orijinal listeden kaldırır, bu nedenle yeni bir listeye atamak gerekmez. RemoveAt() öğesini çağırdıktan sonra "items" içinde ana öğe bulunmayacaktır. – Kurubaran

+1

Yani, DB, ağ, dosyadan tekrar okumanı ister misiniz? Bu uygun değil. – Ajay

2

Performans bir sorunsa, List.CopyTo yöntemini kullanmayı tercih edebilirsiniz.

List<T> RemoveOneItem1<T>(List<T> list, int index) 
{ 
    var listCount = list.Count; 

    // Create an array to store the data. 
    var result = new T[listCount - 1]; 

    // Copy element before the index. 
    list.CopyTo(0, result, 0, index); 

    // Copy element after the index. 
    list.CopyTo(index + 1, result, index, listCount - 1 - index); 

    return new List<T>(result); 
} 

Bu uygulama, @RahulSingh yanıtından neredeyse 3 kat daha hızlıdır.

İlgili konular