What is the best way to iterate over a dictionary?

前端 未结 30 1763
我寻月下人不归
我寻月下人不归 2020-11-22 05:18

I\'ve seen a few different ways to iterate over a dictionary in C#. Is there a standard way?

相关标签:
30条回答
  • 2020-11-22 05:53

    You suggested below to iterate

    Dictionary<string,object> myDictionary = new Dictionary<string,object>();
    //Populate your dictionary here
    
    foreach (KeyValuePair<string,object> kvp in myDictionary) {
        //Do some interesting things;
    }
    

    FYI, foreach doesn't work if the value are of type object.

    0 讨论(0)
  • 2020-11-22 05:55

    If you want to use for loop, you can do this:

    var keyList=new List<string>(dictionary.Keys);
    for (int i = 0; i < keyList.Count; i++)
    {
       var key= keyList[i];
       var value = dictionary[key];
     }
    
    0 讨论(0)
  • 2020-11-22 05:56

    You can also try this on big dictionaries for multithreaded processing.

    dictionary
    .AsParallel()
    .ForAll(pair => 
    { 
        // Process pair.Key and pair.Value here
    });
    
    0 讨论(0)
  • 2020-11-22 05:57

    There are plenty of options. My personal favorite is by KeyValuePair

    Dictionary<string, object> myDictionary = new Dictionary<string, object>();
    // Populate your dictionary here
    
    foreach (KeyValuePair<string,object> kvp in myDictionary)
    {
         // Do some interesting things
    }
    

    You can also use the Keys and Values Collections

    0 讨论(0)
  • 2020-11-22 05:59

    Using C# 7, add this extension method to any project of your solution:

    public static class IDictionaryExtensions
    {
        public static IEnumerable<(TKey, TValue)> Tuples<TKey, TValue>(
            this IDictionary<TKey, TValue> dict)
        {
            foreach (KeyValuePair<TKey, TValue> kvp in dict)
                yield return (kvp.Key, kvp.Value);
        }
    }
    


    And use this simple syntax

    foreach (var(id, value) in dict.Tuples())
    {
        // your code using 'id' and 'value'
    }
    


    Or this one, if you prefer

    foreach ((string id, object value) in dict.Tuples())
    {
        // your code using 'id' and 'value'
    }
    


    In place of the traditional

    foreach (KeyValuePair<string, object> kvp in dict)
    {
        string id = kvp.Key;
        object value = kvp.Value;
    
        // your code using 'id' and 'value'
    }
    


    The extension method transforms the KeyValuePair of your IDictionary<TKey, TValue> into a strongly typed tuple, allowing you to use this new comfortable syntax.

    It converts -just- the required dictionary entries to tuples, so it does NOT converts the whole dictionary to tuples, so there are no performance concerns related to that.

    There is a only minor cost calling the extension method for creating a tuple in comparison with using the KeyValuePair directly, which should NOT be an issue if you are assigning the KeyValuePair's properties Key and Value to new loop variables anyway.

    In practice, this new syntax suits very well for most cases, except for low-level ultra-high performance scenarios, where you still have the option to simply not use it on that specific spot.

    Check this out: MSDN Blog - New features in C# 7

    0 讨论(0)
  • 2020-11-22 05:59

    Just wanted to add my 2 cent, as the most answers relate to foreach-loop. Please, take a look at the following code:

    Dictionary<String, Double> myProductPrices = new Dictionary<String, Double>();
    
    //Add some entries to the dictionary
    
    myProductPrices.ToList().ForEach(kvP => 
    {
        kvP.Value *= 1.15;
        Console.Writeline(String.Format("Product '{0}' has a new price: {1} $", kvp.Key, kvP.Value));
    });
    

    Altought this adds a additional call of '.ToList()', there might be a slight performance-improvement (as pointed out here foreach vs someList.Foreach(){}), espacially when working with large Dictionaries and running in parallel is no option / won't have an effect at all.

    Also, please note that you wont be able to assign values to the 'Value' property inside a foreach-loop. On the other hand, you will be able to manipulate the 'Key' as well, possibly getting you into trouble at runtime.

    When you just want to "read" Keys and Values, you might also use IEnumerable.Select().

    var newProductPrices = myProductPrices.Select(kvp => new { Name = kvp.Key, Price = kvp.Value * 1.15 } );
    
    0 讨论(0)
提交回复
热议问题