2009-07-06 5 views
0

Ich habe eine Liste von Zeichenfolgenwerten, die ich zu einer Hashtabelle oder einem anderen Array hinzufügen möchte, auf das per Schlüssel/Index zugegriffen werden kann, aber nicht implementiert werden kann. Ich habe diese Arbeit, wie ich will, aber seine hässlicheListe verwenden <T> ForEach Element zu HashTable hinzufügen

 List<string> valueList = new List<string>(); 
     valueList.Add("1"); 
     valueList.Add("2"); 
     valueList.Add("3"); 

     Hashtable p = new Hashtable(); 


     valueList.ForEach(delegate(string f) { p.Add(valueList.FindIndex(v => v == f), f); }); 

EDIT: Nachdem James mich daran erinnert, dass eine Liste Werte von Index zurück ging ich mit einer Liste und das ist, was ich mit

valueList.ForEach(f => sequenceList.Add(int.Parse(f))); 
endete
+0

Was Versuchst du es hier zu tun? Erstellen Sie eine Hashtabelle aus der Liste, die den Index dem Schlüssel zuordnet? –

+2

Ich kämpfe um den Nutzen dessen zu sehen, was Sie tun? Warum lässt du es nicht einfach als Liste, wenn du es nur indexierst? – James

+0

Haben Sie beschlossen, es als eine Liste zu verlassen, danke – Jon

Antwort

1

Try this:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x)); 

Obwohl, es gibt wirklich keinen Grund, nicht ein verwenden for hier

for (var index = 0; index < valueList.Count; index++) 
{ 
    htable.Add(index, valueList[index]); 
} 

Es ist mehr Zeilen Code, aber es ist einfacher und führt viel besser (findIndex ist weit weniger effizient als die index aus der for-Anweisung).

+1

Ich würde einfacher gehen als das - Abfrage valueList.Count direkt in der for-Schleife. Der Leistungsunterschied ist vernachlässigbar und der Code ist einfacher. –

+0

@ Jon Skeet, guter Punkt. Ich habe den for-loop-Code auf zwei Zeilen reduziert. –

1

Sie Angenommen, wollen, dass die Strings mit den Tasten und den Index zu sein, der Wert zu sein:

Hashtable ht = new Hashtable(); 

for (var i = 0; i <= valueList.Count; i++) 
{ 
    ht.Add(valueList[i], i); 
} 

Ansonsten um die ht.Add Parameter wechseln. Wenn dies jedoch der Fall ist, sollten Sie es am besten als Liste < string> belassen.

+0

Yup das würde funktionieren, nur gefragt, ob das eingebaute List.ForEach könnte das gleiche tun – Jon

+0

Wenn Sie möchten, dass ht [index] gibt eine Zeichenfolge, dann würde ich vorschlagen Sie verwenden Mitch Wheats Lösung. Wenn es das Gegenteil ist, d. H. Ht [string] gibt den Index zurück, dann schlage ich Minen vor. – James

0
List<string> list = new List<string>{"w", "y", "u", "i", "n"}; 

HashSet<string> hset = new HashSet<string>(list); 
4

Auch wenn es kompiliert wird, würde es nicht funktionieren - Aufruf GetEnumerator().Current wird immer scheitern, weil es Ihnen eine vor dem ersten Element positioniert neuen Iterator geben werde.

Was soll der Schlüssel für jeden Gegenstand sein? Wenn es nur seine Position in der Liste ist, sehe ich nicht den Vorteil, der Ihnen über eine Liste (die bereits von int indiziert ist). Aber man kann es so machen (unter der Annahme, dass valueList ist ein List<string>:

var dictionary = valueList.Select((item, index) => new { item, index }) 
          .ToDictionary(x => x.index, x => x.item); 

es zu einem vorhandenen Wörterbuch hinzufügen, würde ich nur tun:

for (int i=0; i < valueList.Count; i++) 
{ 
    dictionary[i] = valueList[i]; 
} 

Nicht alles muss sein fertig mit lambdas :)

Beachten Sie, dass dies nicht den gleichen Effekt haben wird wie die Verwendung FindIndex, wenn Sie wiederholte Werte haben.

0

Die Verwendung von ForEach ist nicht effizient, da Sie FindIndex verwenden müssen, um herauszufinden, wo Sie sich befinden. Es funktioniert, aber Sie werden eine Menge zusätzlicher Arbeit tun:

valueList.ForEach(x => htable.Add(valueList.FindIndex(y => y == x), x)); 

Es ist besser, nur eine regelmäßige Schleife zu verwenden, so dass Sie den Index erhalten, ohne durch den Tisch zu suchen hat:

for (int i = 0; i < valueList.Count; i++) { 
    htable.Add(i, valueList[i]); 
} 
Verwandte Themen