C# Linq的ToDictionary()方法 – 将序列转换为字典

  • Post category:C#

C# Linq ToDictionary()函数可以将一个集合转换为字典。它接受委托作为参数,并根据选择的键和值创建一个字典。

下面是ToDictionary()函数的完整语法:

public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    Func<TSource, TElement> elementSelector
)

其中,source是要进行转换的集合,keySelector是用于选择键的委托,elementSelector是用于选择值的委托。

示例1:使用ToDictionary()将一个字符串集合转换为字典,其中字符串的长度用作键,字符串本身用作值。

List<string> words = new List<string>() {"apple", "banana", "cherry", "pear"};
Dictionary<int, string> dictionary = words.ToDictionary(w => w.Length, w => w);

// 输出字典
foreach (KeyValuePair<int, string> pair in dictionary)
{
    Console.WriteLine("Key: {0}, Value: {1}", pair.Key, pair.Value);
}

输出:

Key: 5, Value: apple
Key: 6, Value: banana
Key: 6, Value: cherry
Key: 4, Value: pear

注意到字典中有两个键的值都是6,这是因为“banana”和“cherry”的长度都是6。

示例2:使用ToDictionary()将一个自定义类型的集合转换为字典,其中自定义类型的某个属性用作键,对象本身用作值。

假设我们有一个自定义类型Person,其中有一个属性叫做Id,表示这个人的身份证号码。

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

现在我们有一个Person类型的集合,我们想要以每个人的Id作为键,每个Person对象本身作为值,来创建一个字典。

List<Person> people = new List<Person>
{
    new Person { Id = 1, Name = "Alice" },
    new Person { Id = 2, Name = "Bob" },
    new Person { Id = 3, Name = "Charlie" }
};
Dictionary<int, Person> dictionary = people.ToDictionary(p => p.Id, p => p);

// 输出字典
foreach (KeyValuePair<int, Person> pair in dictionary)
{
    Console.WriteLine("Key: {0}, Value: {1}", pair.Key, pair.Value.Name);
}

输出:

Key: 1, Value: Alice
Key: 2, Value: Bob
Key: 3, Value: Charlie

这个例子中,我们使用了自定义类型Person,并在ToDictionary()函数中通过lambda表达式指定了键和值的属性。