📅  最后修改于: 2023-12-03 15:17:19.810000             🧑  作者: Mango
在使用 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 查询结果转换为字典类型的简单方式。它可以接受一个委托参数,用于从源数据集合中提取键值。如果源数据集合中存在相同的键值,可以使用比较器来处理冲突。