2010-10-27 11 views
10

Estoy usando la clase de búsqueda en C# como contenedor de datos principal para que el usuario seleccione valores de dos cuadros de Lista comprobada.C# System.Linq.Lookq Clase Eliminación y adición de valores

La clase de búsqueda es mucho más fácil de usar que usar la clase Diccionario>, sin embargo, no puedo encontrar métodos para eliminar y agregar valores a una clase de búsqueda.

Pensé en usar el lugar y la unión, pero parece que no puedo hacerlo bien.

Gracias de antemano.

+0

¿Por qué no crear estás propia implementación de búsqueda? Basándolo en un diccionario, no debería tomar más que unas pocas líneas de código. – leppie

+0

Tipo de acuerdo con Leppie aquí. La clase de búsqueda está allí solo para buscar datos, no para modificarlos. Además, el diccionario no es demasiado difícil de usar de todos modos, podría ser bueno escribir un contenedor en la parte superior de un diccionario. –

+0

La búsqueda también tiene un mecanismo diferente para realizar las búsquedas reales en un diccionario. Pero con algunas pruebas simples, ambas funcionan muy rápido. –

Respuesta

11

Desafortunadamente, la creación de la clase de búsqueda es interna para .NET Framework. La forma en que se crea la búsqueda es a través de Factory Methods estáticos en la clase Lookup. Estos son:

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

Sin embargo, estos métodos son internos y no son para el consumo de nosotros. La clase de búsqueda no tiene forma de eliminar elementos.

Una forma de hacer un agregar y quitar es crear constantemente nuevos ILookups. Por ejemplo, cómo eliminar 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); 

Para añadir a la lista, podríamos hacer algo como esto:

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

La eliminación funciona, ¿puede informarme? cómo agregar elementos a la lista de búsqueda. Háganme saber si es posible agregar y quitar elementos a la lista interna. –

+0

acaba de agregar, déjame saber lo que piensas –

+0

Funciona, muchas gracias. Supongo que en cuanto a eliminar datos de la lista interna, el proceso es fácil, ya que ahora tengo una lista antes de la llamada al método ToLookup. –

Cuestiones relacionadas