Vraag Wat is de beste manier om alle waarden in een C # Dictionary in te stellen?


Wat is de beste manier om alle waarden in een C # -woordenboek in te stellen?

Dit is wat ik nu aan het doen ben, maar ik weet zeker dat er een betere / schonere manier is om dit te doen:

Dictionary<string,bool> dict = GetDictionary();
var keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
    dict[keys[i]] = false;
}

Ik heb een aantal andere manieren geprobeerd met foreach, maar ik had fouten.


27
2017-07-22 17:57


oorsprong


antwoorden:


Dat is een redelijke benadering, hoewel ik de voorkeur zou geven aan:

foreach (var key in dict.Keys.ToList())
{
    dict[key] = false;
}

De oproep aan ToList() zorgt ervoor dat dit werkt, omdat het de lijst met toetsen eruit haalt en (tijdelijk) opslaat, zodat de iteratie werkt.


63
2017-07-22 18:01



Een oplossing met één regel:

dict = dict.ToDictionary(p => p.Key, p => false);

21
2018-05-15 17:33



Als u geen tri-state Bools gebruikt, kunt u deze gebruiken HashSet<string>en bel Clear() om de waarden in te stellen op "false".


6
2017-07-22 18:06



Ik weet niet zeker of dit de beste manier is, maar ik was op zoek naar iets op een enkele regel en dit werkte voor mij

mydict.Keys.ToList().ForEach(k => mydict[k] = false);

3
2018-05-18 10:15



Ik heb het verschil tussen de oplossingen van Billy en Reed geprofileerd. Polaris878, let goed op de resultaten en onthoud dat voortijdige optimalisatie de wortel is van al het kwaad ;-)

Ik herschreef de oplossingen in VB (omdat ik momenteel in die taal programmeer) en gebruikte int-toetsen (voor de eenvoud), anders is het exact dezelfde code. Ik heb de code uitgevoerd met een woordenboek van 10 miljoen vermeldingen met de waarde 'waar' voor elk item.

Billy Witch Doctor's originele oplossing:

Dim keys = dict.Keys.ToList
For i = 0 To keys.Count - 1
    dict(keys(i)) = False
Next

Verstreken milliseconden: 415

De oplossing van Reed Copsey:

For Each key In dict.Keys.ToList
    dict(key) = False
Next

Verstreken milliseconden: 395

Dus in dat geval is het foreach eigenlijk sneller.


2
2017-07-22 18:43



U kunt de ToList () rechtstreeks verwijderen en rechtstreeks over de woordenboekitems itereren

Dictionary<string, bool> dict = GetDictionary();
foreach (var pair in dict) 
{
    dict[pair.Key] = false;
}

-2
2017-07-22 18:01



Doe het zoals je het nu hebt ... want elk is traag. foreach kan schoner zijn, maar je gebruikt te veel van een performance-hit.

Bewerk:
http://www.codeproject.com/KB/cs/foreach.aspx
http://www.madprops.org/blog/for-vs-foreach-performance/


-4
2017-07-22 18:01