2010-10-27 26 views
10

J'utilise la classe Lookup en C# comme conteneur de données principal pour que l'utilisateur sélectionne des valeurs dans deux zones de liste cochée. La classe Lookup est beaucoup plus facile à utiliser que l'utilisation de la classe Dictionary>, mais je ne trouve pas de méthodes pour supprimer et ajouter des valeurs à une classe de recherche. J'ai pensé à l'utilisation de l'endroit et de l'union, mais je ne peux pas avoir l'air de bien faire les choses.C# System.Linq.Lookup Class Suppression et ajout de valeurs

Merci d'avance.

+0

Pourquoi vous êtes ne pas vous créer votre propre application de recherche? Basé sur un dictionnaire, ne devrait pas prendre plus de quelques lignes de code. – leppie

+0

Sorte d'accord avec lepie ici. La classe de recherche est là uniquement pour rechercher des données, et non pour les modifier. De plus, le dictionnaire n'est pas trop difficile à utiliser de toute façon, peut-être bien d'écrire un wrapper sur un dictionnaire. –

+0

La recherche a également un mécanisme différent pour faire les recherches réelles sur un dictionnaire. Mais avec quelques tests simples, ils fonctionnent tous deux très rapidement. –

Répondre

11

Malheureusement, la création de la classe Lookup est interne au framework .NET. La façon dont la recherche est créée est via les méthodes d'usine statiques dans la classe Recherche. Ce sont:

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

Cependant, ces méthodes sont internes et non pour la consommation par nous. La classe de recherche n'a aucun moyen de supprimer des éléments. Une façon d'ajouter et de supprimer est de créer constamment de nouveaux ILookups. Par exemple - comment supprimer un élément.

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

Pour ajouter à la liste, nous pourrions faire quelque chose comme ceci:

//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

Les travaux de suppression, pouvez-vous s'il vous plaît laissez-moi savoir comment ajouter des éléments à la liste de recherche. S'il vous plaît laissez-moi savoir s'il est possible d'ajouter et supprimer des éléments à la liste intérieure. –

+0

vient d'ajouter, laissez-moi savoir ce que vous pensez –

+0

Cela fonctionne, merci beaucoup. Je suppose qu'en ce qui concerne la suppression des données de la liste interne, le processus est facile, car j'ai maintenant une liste avant l'appel de la méthode ToLookup. –