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
代替。