2016-09-01 3 views
-3

Ich habe eine C# Liste:Holen Sie sich alle Wörterbücher Werte mit Linq-Abfrage

private List<Tuple<string, string>> _list1 = new List<Tuple<string,string>>(); 
string keyToLookFor; 
string valueToLookFor; 

Ich mag diese Liste suchen mithilfe von LINQ überprüfen, ob zuerst ein bestimmten Schlüssel bereits vorhanden ist und wenn ja, macht seinen Wert übereinstimmen valueToLookFor.

List.Add(new Tuple<string, string>("1", "data1")); 
List.Add(new Tuple<string, string>("2", "data2")); 
List.Add(new Tuple<string, string>("2", "data3")); 
List.Add(new Tuple<string, string>("3", "data3")); 

Also für dieses Beispiel möchte ich finden, ist "2" existiert und überprüfen, ob seine Daten übereinstimmen, was ich suche. Wie kann ich das in LINQ tun?

+0

warum nicht eine Klasse Ich denke, in Ihrem Fall schaffen würde es viel einfacher sein .. auch getan haben Sie eine Google-Suche auf, wie die Werte von einem Tuple lesen mit Linq .. Wenn Sie diese mit einem machen wollen Klasse beziehen sich auf dieses vorherige Posting - http://stackoverflow.com/questions/10597629/make-our-own-liststring-string-string – MethodMan

+0

Dictionary klingt wie, was Sie suchen –

+0

Kann ein Wörterbuch nicht eindeutige Schlüssel haben ?? –

Antwort

0

Sie sollten wahrscheinlich ein Wörterbuch verwenden, anstatt alles, was Sie in

Dictionary<string,string> _list1 = new Dictionary<string,string>(); 
if(_list1.containsKey(keyToLookFor)) { 
    return _list1[keyToLookFor] == valueToLookFor; 
} 
3

Der Schlüssel in einer Liste der Tupel ist nicht einzigartig, zuerst möchten Sie vielleicht einen

Dictionary<string, string>() 

gebaut beschreiben verwenden, aber wenn Sie möchten die Liste behalten

+0

Ich brauche es nicht einzigartig, warum ich kein Wörterbuch verwende. –

+0

@ Ich dachte HashSet war die einzige Klasse, die unterschiedliche Werte benötigt – Edward

+0

Sie erhalten eine ArgumentException, wenn Sie versuchen, einen doppelten Schlüssel zu einem Wörterbuch hinzufügen –

3

Wenn Sie C# 6 verwenden (und jedes Tupel hat eine eindeutige Schlüsselwert):

bool exists = _list1.SingleOrDefault(t => t.Item1 == keyToLookFor)?.Item2 == valueToLookFor; 

Wenn Ihre Liste kann mit dem gleichen Schlüsselwert mehr als ein Tupel haben:

bool exists = _list1.Any(t => t.Item1 == keyToLookFor && t.Item2 == valueToLookFor); 
+0

Was bedeutet das? Machen? – Edward

+0

@Edward Es ist ein [Null-Bedingter Operator] (https://msdn.microsoft.com/en-us/library/dn986595.aspx) –

+0

Sie brauchen also, um falsch zurückzugeben, wenn es keine Übereinstimmungen gibt? – Edward

3

HashSet würde den Trick (es kann Duplikate behandeln). Es ist auch erwähnenswert, dass HashSets für Hochleistungs-Set-Operationen entwickelt wurden. Wenn Ihre list1 sehr groß ist und/oder Sie häufig Nachschlagevorgänge durchführen, sollten Sie ein HashSet verwenden.

List<Tuple<string, string>> list1 = new List<System.Tuple<string, string>>(); 
list1.Add(new Tuple<string, string>("1", "data1")); 
list1.Add(new Tuple<string, string>("2", "data2")); 
list1.Add(new Tuple<string, string>("2", "data3")); 
list1.Add(new Tuple<string, string>("2", "data3")); //duplicate 
list1.Add(new Tuple<string, string>("3", "data3")); 

var hs = new HashSet<Tuple<string, string>>(list1); 

var toCheck = new Tuple<string,string>("2","data3"); 
Console.WriteLine(hs.Contains(toCheck)); //True 
toCheck = new Tuple<string,string>("2","data7"); 
Console.WriteLine(hs.Contains(toCheck)); //False 
Verwandte Themen