📜  LINQ ToDictionary()方法(1)

📅  最后修改于: 2023-12-03 15:17:19.810000             🧑  作者: Mango

LINQ ToDictionary()方法

在使用 LINQ 查询数据时,经常需要将结果集转换成字典类型。这时候就可以使用 ToDictionary() 方法。

语法
ToDictionary<TSource, TKey>(Func<TSource, TKey> keySelector)
  • TSource:要转换的源数据集合类型。
  • TKey:用于字典中作为键的类型。
  • keySelector:从 TSource 对象中提取键值的函数。
示例

假设有一个 Person 类型的数据集合,其中包含每个人的姓名和年龄:

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

List<Person> persons = new List<Person>
{
    new Person { Name = "Alice", Age = 20 },
    new Person { Name = "Bob", Age = 25 },
    new Person { Name = "Charlie", Age = 30 }
};

现在希望将这个集合转换成字典类型,键为姓名,值为年龄。可以使用以下 LINQ 查询:

var dictionary = persons.ToDictionary(p => p.Name, p => p.Age);

这个查询将会返回一个字典类型的对象,内容为:

{
    { "Alice", 20 },
    { "Bob", 25 },
    { "Charlie", 30 }
}

可以通过以下方式访问字典中的数据:

Console.WriteLine(dictionary["Alice"]);  // 输出 20
Console.WriteLine(dictionary["Bob"]);    // 输出 25
Console.WriteLine(dictionary["Charlie"]);// 输出 30
键冲突

在转换数据集合时,如果存在两个或多个元素具有相同的键值,则会引发 System.ArgumentException 异常。为了避免这个问题,可以使用 ToDictionary() 方法提供的另一个重载,它允许指定比较器以处理键的冲突。这个重载的语法如下:

ToDictionary<TSource, TKey>(Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)

其中 comparer 是用于比较键值的对象。可以使用 EqualityComparer<TKey>.Default 来使用默认的比较器。如果需要自定义比较器,可以创建一个实现 IEqualityComparer<TKey> 接口的对象,例如:

class PersonNameComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        return string.Equals(x, y, StringComparison.OrdinalIgnoreCase);
    }

    public int GetHashCode(string obj)
    {
        return obj.ToLower().GetHashCode();
    }
}

var dictionary = persons.ToDictionary(p => p.Name, p => p.Age, new PersonNameComparer());

这个示例使用 PersonNameComparer 类型的对象作为键的比较器,它会忽略字母的大小写。因此,下面的两行代码将会返回相同的结果:

dictionary["Alice"] = 20;
dictionary["ALICE"] = 30;
Console.WriteLine(dictionary["Alice"]); // 输出 30
Console.WriteLine(dictionary["ALICE"]); // 输出 30
总结

ToDictionary() 方法提供了一种将 LINQ 查询结果转换为字典类型的简单方式。它可以接受一个委托参数,用于从源数据集合中提取键值。如果源数据集合中存在相同的键值,可以使用比较器来处理冲突。