2014-12-31 25 views
8

C'è uno List<int> contenente un gruppo di numeri. Seleziono casualmente un indice, che verrà elaborato separatamente (chiamalo master). Ora, voglio escludere questo indice particolare e ottenere tutti gli altri elementi di List (chiamarli slave).Escluso un articolo dall'elenco (per Indice) e prendere tutti gli altri

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 - nessuno di loro, e come?

MODIFICA: Impossibile rimuovere qualsiasi elemento dall'elenco originale, altrimenti devo tenere due elenchi.

risposta

16

Uso Where: -

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

lavoro Fiddle.

+0

Bello! Funziona perfettamente. Questa forma di "Dove" non era ovvia da nessuna parte nella documentazione. – Ajay

+0

@Ajay - La documentazione è lì, controlla il link che ho condiviso per 'Where', è il secondo overload di Where. –

+2

Sì. A questo punto, ho già utilizzato questo approccio nel codice del prodotto attuale (che non è ovviamente una lista di interi). – Ajay

2

Si potrebbe rimuovere oggetto master dall'elenco,

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

RemoveAt() rimuove l'elemento dall'elenco originale, quindi non è necessario assegnare alla raccolta per un nuovo elenco. Dopo aver chiamato RemoveAt(), items.Contains(MasterItem) restituirà false.

+0

Richiede due elenchi. Devo mantenere originale! – Ajay

+1

@Ajay RemoveAt() rimuove l'elemento dall'elenco originale, quindi non è necessario assegnarlo a un nuovo elenco. Dopo aver chiamato RemoveAt(), "items" non avrà l'elemento master in esso. – Kurubaran

+1

Quindi, dovrei leggere di nuovo da DB, rete, file? Non è appropriato. – Ajay

2

Se le prestazioni sono un problema, è preferibile utilizzare il metodo List.CopyTo in questo modo.

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); 
} 

Questa implementazione è quasi 3 volte più veloce della risposta @RahulSingh.