91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

c# 實現遍歷 Dictionary的方法

發布時間:2020-10-30 15:02:22 來源:億速云 閱讀:558 作者:Leah 欄目:開發技術

c# 實現遍歷 Dictionary的方法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1. 直接 foreach dict

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

      foreach (var item in dict)
      {
        Console.WriteLine($"key={item.Key},value={item.Value}");
      }

c# 實現遍歷 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 解構

剛才你也看到了 item 是 KeyValuePair 類型,不過&#128002;&#128067;的是 netcore 對 KeyValuePair 進行了增強,增加了 Deconstruct 函數用來解構 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;
    }
  }

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

      foreach ((int key, string value) in dict)
      {
        Console.WriteLine($"key={key},value={value}");
      }

c# 實現遍歷 Dictionary的方法

3. foreach keys

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

      foreach (var key in dict.Keys)
      {
        Console.WriteLine($"key={key},value={dict[key]}");
      }

c# 實現遍歷 Dictionary的方法

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

三:使用 for 遍歷

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

      for (int i = 0; i < dict.Count; i++)
      {
        (int key, string value) = dict.ElementAt(i);

        Console.WriteLine($"key={key},value={dict[key]}");
      }

c# 實現遍歷 Dictionary的方法

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

  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--;
        }
      }
    }
  }

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

靖江市| 湘西| 屯昌县| 荔波县| 延吉市| 安仁县| 汉中市| 怀化市| 绥棱县| 清水河县| 荃湾区| 龙南县| 内丘县| 道孚县| 南康市| 什邡市| 前郭尔| 陆河县| 平乡县| 朝阳县| 清河县| 濮阳县| 孝感市| 丰都县| 新化县| 西峡县| 淮安市| 莲花县| 阿拉善盟| 金门县| 大连市| 霍林郭勒市| 北宁市| 健康| 靖边县| 鲁山县| 托克逊县| 灯塔市| 普安县| 克什克腾旗| 通渭县|