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