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);
fonte
2010-10-27 07:56:52
Perché non si creano sei propria implementazione di ricerca? Basandolo su un dizionario, non dovrebbe richiedere più di poche righe di codice. – leppie
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. –
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. –