我们来详细讲讲 C# 里的 KeyValuePair<TKey, TValue> —— 它是键值对(key-value pair)的基础类型,在字典(Dictionary<TKey, TValue>)中非常常见。


🔹 一、概念说明

KeyValuePair<TKey, TValue> 是一个结构体,定义在命名空间:


using System.Collections.Generic;

它包含两个只读属性:

  • Key:键(TKey)

  • Value:值(TValue)


🔹 二、常见用法

✅ 示例 1:创建 KeyValuePair

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pair = new KeyValuePair<int, string>(1, "Apple");

        Console.WriteLine($"Key = {pair.Key}, Value = {pair.Value}");
    }
}

输出:

Key = 1, Value = Apple

✅ 示例 2:遍历 Dictionary(最常见)

var dict = new Dictionary<int, string>
{
    {1, "Apple"},
    {2, "Banana"},
    {3, "Cherry"}
};

foreach (KeyValuePair<int, string> kvp in dict)
{
    Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
}

输出:

Key: 1, Value: Apple
Key: 2, Value: Banana
Key: 3, Value: Cherry

💡foreach 遍历 Dictionary 时,每个元素就是一个 KeyValuePair<TKey, TValue>


✅ 示例 3:配合 LINQ 使用

using System.Linq;

var dict = new Dictionary<string, int>
{
    {"Tom", 80},
    {"Bob", 90},
    {"Alice", 95}
};

// 按值排序
var sorted = dict.OrderByDescending(kvp => kvp.Value);

foreach (var kvp in sorted)
{
    Console.WriteLine($"{kvp.Key} => {kvp.Value}");
}

✅ 示例 4:用 KeyValuePair 构造 Dictionary

var pairs = new List<KeyValuePair<string, int>>
{
    new KeyValuePair<string, int>("A", 100),
    new KeyValuePair<string, int>("B", 200)
};

var dict = pairs.ToDictionary(p => p.Key, p => p.Value);

🔹 三、KeyValuePair vs DictionaryEntry

特性 KeyValuePair<TKey, TValue> DictionaryEntry
泛型 ✅ 是 ❌ 否
命名空间 System.Collections.Generic System.Collections
推荐用法 推荐用于 Dictionary<TKey, TValue> 仅用于 Hashtable 等老式集合

🔹 四、典型场景(在项目中)

例如你要返回一组键值对应关系(例如版本号和名字):

List<KeyValuePair<long, string>> versionList = new()
{
    new KeyValuePair<long, string>(1001, "V1.0"),
    new KeyValuePair<long, string>(1002, "V2.0"),
};

或者在循环中临时收集数据:

var results = new List<KeyValuePair<string, int>>();

foreach (var user in users)
{
    results.Add(new KeyValuePair<string, int>(user.Name, user.Score));
}

✅ 总结

功能 示例
创建 new KeyValuePair<int, string>(1, "A")
获取键 pair.Key
获取值 pair.Value
遍历字典 foreach (var kvp in dict)
构建集合 List<KeyValuePair<string,int>>
转换成字典 .ToDictionary(p => p.Key, p => p.Value)

源码:

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Text;

namespace System.Collections.Generic
{
    // Provides the Create factory method for KeyValuePair<TKey, TValue>.
    public static class KeyValuePair
    {
        // Creates a new KeyValuePair<TKey, TValue> from the given values.
        public static KeyValuePair<TKey, TValue> Create<TKey, TValue>(TKey key, TValue value) =>
            new KeyValuePair<TKey, TValue>(key, value);

        /// <summary>Used by KeyValuePair.ToString to reduce generic code</summary>
        internal static string PairToString(object? key, object? value) =>
            string.Create(null, stackalloc char[256], $"[{key}, {value}]");
    }

    // A KeyValuePair holds a key and a value from a dictionary.
    // It is used by the IEnumerable<T> implementation for both IDictionary<TKey, TValue>
    // and IReadOnlyDictionary<TKey, TValue>.
    [Serializable]
    [TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
    public readonly struct KeyValuePair<TKey, TValue>
    {
        [DebuggerBrowsable(DebuggerBrowsableState.Never)]
        private readonly TKey key; // Do not rename (binary serialization)
        [DebuggerBrowsable(DebuggerBrowsableState.Never)]
        private readonly TValue value; // Do not rename (binary serialization)

        public KeyValuePair(TKey key, TValue value)
        {
            this.key = key;
            this.value = value;
        }

        public TKey Key => key;

        public TValue Value => value;

        public override string ToString()
        {
            return KeyValuePair.PairToString(Key, Value);
        }

        [EditorBrowsable(EditorBrowsableState.Never)]
        public void Deconstruct(out TKey key, out TValue value)
        {
            key = Key;
            value = Value;
        }
    }
}

仅供学习参考,如有侵权联系我删除。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐