2010-10-27 9 views
10

Ich verwende die Lookup-Klasse in C# als primärer Datencontainer, damit der Benutzer Werte aus zwei Checked List-Feldern auswählen kann.C# System.Linq.Lookup Klasse Entfernen und Hinzufügen von Werten

Die Suche-Klasse ist viel einfacher zu verwenden als die Verwendung der Klasse Dictionary>, aber ich finde keine Methoden zum Entfernen und Hinzufügen von Werten zu einer Suchklasse.

Ich dachte über die Verwendung der Wo und der Union, aber ich kann nicht scheinen, es richtig zu machen.

Vielen Dank im Voraus.

+0

Warum nicht erstellen Sie youre Lookup Implementierung besitzen? Bei einem Dictionary sollte es nicht mehr als ein paar Zeilen Code benötigen. – leppie

+0

Irgendwie einverstanden mit leppie hier. Die Nachschlageklasse dient nur zum Nachschlagen von Daten, nicht zum Ändern von Daten. Außerdem ist das Wörterbuch sowieso nicht zu schwer zu benutzen, vielleicht wäre es schön, einen Wrapper oben auf ein Wörterbuch zu schreiben. –

+0

Die Suche hat auch einen anderen Mechanismus, um die tatsächlichen Lookups über ein Wörterbuch zu tun. Aber mit einigen einfachen Tests sind beide sehr schnell. –

Antwort

11

Leider ist die Erstellung der Lookup-Klasse im .NET-Framework intern. Die Art, wie die Suche erstellt wird, erfolgt über statische Factory-Methoden in der Lookup-Klasse. Diese sind:

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

Diese Methoden sind jedoch intern und nicht für den Verbrauch von uns. Die Nachschlageklasse hat keine Möglichkeit, Elemente zu entfernen.

Eine Möglichkeit zum Hinzufügen und Entfernen besteht darin, ständig neue ILookups zu erstellen. Zum Beispiel - wie man ein Element löscht.

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

Für die Liste hinzuzufügen, könnten wir so etwas tun:

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

Das Entfernen funktioniert, können Sie mir bitte Bescheid geben wie man Elemente zur Nachschlageliste hinzufügt. Bitte lassen Sie mich wissen, wenn es möglich ist, Elemente zur inneren Liste hinzuzufügen und zu entfernen. –

+0

gerade hinzugefügt, lassen Sie mich wissen, was Sie denken –

+0

Es funktioniert, vielen Dank. Ich denke, soweit es um das Entfernen von Daten aus der inneren Liste geht, ist der Prozess einfach, da ich jetzt eine Liste vor dem Aufruf der ToLookup-Methode habe. –

Verwandte Themen