ToDictionary

ToDictionary() LINQ 方法可用于基于给定的 IEnumerable<T> 源生成 Dictionary<TKey, TElement> 集合。

IEnumerable<User> users = GetUsers();
Dictionary<int, User> usersById = users.ToDictionary(x => x.Id);

在此示例中,传递给 ToDictionary 的单个参数的类型为 Func<TSource, TKey>,它返回每个元素的键。

这是执行以下操作的简明方法:

Dictionary<int, User> usersById = new Dictionary<int User>();
foreach (User u in users) 
{
  usersById.Add(u.Id, u);
}

你还可以将第二个参数传递给 ToDictionary 方法,该方法的类型为 Func<TSource, TElement>,并返回要为每个条目添加的 Value

IEnumerable<User> users = GetUsers();
Dictionary<int, string> userNamesById = users.ToDictionary(x => x.Id, x => x.Name);

也可以指定用于比较键值的 IComparer。当键是字符串并且你希望它与大小写不匹配时,这可能很有用。

IEnumerable<User> users = GetUsers();
Dictionary<string, User> usersByCaseInsenstiveName = users.ToDictionary(x => x.Name, StringComparer.InvariantCultureIgnoreCase);

var user1 = usersByCaseInsenstiveName["john"];
var user2 = usersByCaseInsenstiveName["JOHN"];
user1 == user2; // Returns true

注意:ToDictionary 方法要求所有键都是唯一的,必须没有重复键。如果有,则会抛出异常:ArgumentException: An item with the same key has already been added. 如果你有一个场景,你知道你将拥有多个具有相同键的元素,那么你最好使用 ToLookup 代替。