溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dictionary遍歷的使用方法有哪些

發(fā)布時間:2021-10-26 17:30:29 來源:億速云 閱讀:171 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“Dictionary遍歷的使用方法有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Dictionary遍歷的使用方法有哪些”吧!

 使用 foreach 遍歷

為了方便演示,先上一段測試代碼:

var dict = new Dictionary<int, string>()             {                [10] = "A10",                 [20] = "A20",                 [30] = "A30",                 [40] = "A40",                 [50] = "A50"             };

1. 直接 foreach dict

如果要拿百分比說話,估計有 50%+ 的小伙伴用這種方式,為啥,簡單粗暴唄,其他沒什么好說的,直接上代碼:

foreach (var item in dict)            {                Console.WriteLine($"key={item.Key},value={item.Value}");            }
Dictionary遍歷的使用方法有哪些

這里的 item 是底層在 MoveNext 的過程中用 KeyValuePair 包裝出來的,如果你不信的話,看下源碼唄:

public bool MoveNext()    {        while ((uint)_index < (uint)_dictionary._count)        {            ref Entry reference = ref _dictionary._entries[_index++];            if (reference.next >= -1)            {                _current = new KeyValuePair<TKey, TValue>(reference.key, reference.value);                return true;            }        }    }

2. foreach 中 使用 KeyPairValue 解構(gòu)

剛才你也看到了 item 是 KeyValuePair 類型,不過的是 netcore 對 KeyValuePair 進行了增強,增加了  Deconstruct 函數(shù)用來解構(gòu) KeyValuePair,代碼如下:

public readonly struct KeyValuePair<TKey, TValue>     {        private readonly TKey key;         private readonly TValue value;         public TKey Key => key;         public TValue Value => value;         public KeyValuePair(TKey key, TValue value)         {            this.key = key;             this.value = value;         }        public void Deconstruct(out TKey key, out TValue value)         {            key = Key;            value = Value;         }    }

有了這個解構(gòu)函數(shù),你就可以在遍歷的過程中直接拿到 key,value,而不是包裝的 KeyValuePair,這在 netframework  中可是不行的哈,實現(xiàn)代碼如下:

foreach ((int key, string value) in dict)             {                Console.WriteLine($"key={key},value={value}");             }
Dictionary遍歷的使用方法有哪些

3. foreach keys

前面的例子都是直接對 dict 進行 foreach,其實你還可以對 dict.keys 進行 foreach 遍歷,然后通過遍歷出的 key 對  dict 進行類索引器讀取,代碼如下:

foreach (var key in dict.Keys)           {                Console.WriteLine($"key={key},value={dict[key]}");           }
Dictionary遍歷的使用方法有哪些

說到這里,不知道你是否有一個潛意識,那就是 dict 只能通過 foreach 進行遍歷,真相是不是這樣的呢? 要尋找答案,還是回頭看一下 foreach  是如何進行遍歷的。

public struct Enumerator : IEnumerator<KeyValuePair<TKey, TValue>>, IDisposable, IEnumerator, IDictionaryEnumerator {    public bool MoveNext()     {        while ((uint)_index < (uint)_dictionary._count)         {            ref Entry reference = ref _dictionary._entries[_index++];             if (reference.next >= -1)             {                _current = new KeyValuePair<TKey, TValue>(reference.key, reference.value);                 return true;             }        }        _index = _dictionary._count + 1;         _current = default(KeyValuePair<TKey, TValue>);         return false;     }}

仔細看這個 while 循環(huán),你就應該明白,本質(zhì)上它也是對 entries 數(shù)組進行遍歷,那底層都用了 while,我是不是可以用 for 來替換然后循環(huán)  dict 呢?哈哈,反正就是模仿唄。

使用 for 遍歷

為了把 MoveNext 中的代碼模擬出來,重點在于這條語句: ref Entry reference = ref  _dictionary._entries[_index++];, 其實很簡單,_entries 數(shù)組內(nèi)容的提取可以用 Linq 的 ElementAt  方法,是不是~ ,改造后的代碼如下:

for (int i = 0; i < dict.Count; i++) {                (int key, string value) = dict.ElementAt(i);     Console.WriteLine($"key={key},value={dict[key]}"); }
Dictionary遍歷的使用方法有哪些

接下來是不是很好奇這個 ElementAt 擴展方法是如何實現(xiàn)的,一起看看源碼吧。

public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index) {        IList<TSource> list = source as IList<TSource>;     if (list != null)     {            return list[index];     }        if (index >= 0)     {            using (IEnumerator<TSource> enumerator = source.GetEnumerator())         {                while (enumerator.MoveNext())             {                    if (index == 0)                 {                        return enumerator.Current;                 }                    index--;                }            }        }    }

到此,相信大家對“Dictionary遍歷的使用方法有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI