2010-10-27 14 views
10

Sto utilizzando la classe Lookup in C# come contenitore dati principale per consentire all'utente di selezionare valori da due caselle Elenco controllato.C# System.Linq.Lookup Classe Rimozione e aggiunta di valori

La classe di ricerca è molto più facile da utilizzare rispetto all'utilizzo della classe Dizionario>, tuttavia non riesco a trovare metodi per la rimozione e l'aggiunta di valori a una classe di ricerca.

Ho pensato di usare il dove e il sindacato, ma non riesco a farlo bene.

Grazie in anticipo.

+0

Perché non si creano sei propria implementazione di ricerca? Basandolo su un dizionario, non dovrebbe richiedere più di poche righe di codice. – leppie

+0

Tipo d'accordo con leppie qui. La classe di ricerca è lì per cercare solo i dati, non per modificarli. Inoltre, il dizionario non è troppo difficile da usare in ogni caso, potrebbe essere bello solo scrivere un wrapper su un dizionario. –

+0

La ricerca ha anche un meccanismo diverso per effettuare le ricerche effettive su un dizionario. Ma con alcuni semplici test, entrambi si esibiscono molto velocemente. –

risposta

11

Sfortunatamente la creazione della classe Lookup è interna al framework .NET. Il modo in cui viene creata la ricerca è tramite metodi di produzione statici nella classe Ricerca. Questi sono:

internal static Lookup<TKey, TElement> Create<TSource>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer); 
    internal static Lookup<TKey, TElement> CreateForJoin(IEnumerable<TElement> source, Func<TElement, TKey> keySelector, IEqualityComparer<TKey> comparer); 

Tuttavia, questi metodi sono interni e non per il consumo da parte nostra. La classe di ricerca non ha alcun modo di rimuovere elementi.

Un modo per aggiungere e rimuovere è quello di creare costantemente nuovi ILookup. Ad esempio: come eliminare un elemento.

public class MyClass 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

//We have a fully populated set: 
var set = new List<MyClass>() //Populate this. 
var lookup = set.ToLookup(m => m.Key, m => m); 

//Remove the item where the key == "KEY"; 
//Now you can do something like that, modify to your taste. 
lookup = lookup 
    .Where(l => !String.Equals(l.Key, "KEY")) 
    //This just flattens the set - up to you how you want to accomplish this 
    .SelectMany(l => l) 
    .ToLookup(l => l.Key, l => l.Value); 

Per aggiungere alla lista, si potrebbe fare qualcosa di simile:

//We have a fully populated set: 
var set = new List<MyClass>() //Populate this. 
var lookup = set.ToLookup(m => m.Key, m => m); 

var item = new MyClass { Key = "KEY1", Value = "VALUE2" }; 

//Now let's "add" to the collection creating a new lookup 
lookup = lookup 
    .SelectMany(l => l) 
    .Concat(new[] { item }) 
    .ToLookup(l => l.Key, l => l.Value); 
+0

I lavori di rimozione, per favore fammi sapere come aggiungere elementi all'elenco di ricerca. Per favore fatemi sapere se è possibile aggiungere e rimuovere elementi nella lista interna. –

+0

appena aggiunto, fammi sapere cosa ne pensi –

+0

Funziona, grazie mille. Suppongo che per quanto riguarda la rimozione dei dati dall'elenco interno, il processo sia facile, poiché ora ho una lista prima della chiamata al metodo ToLookup. –

Problemi correlati