他の回答のほとんどの問題は、彼らが使用していることであるDistinct
、GroupBy
またはToLookup
フードの下の余分な辞書を作成します。同様に、ToUpperは追加の文字列を作成します。これは私がやったことであり、1つの変更を除いて、Microsoftのコードのほぼ正確なコピーです。
public static Dictionary<TKey, TSource> ToDictionaryIgnoreDup<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null) =>
source.ToDictionaryIgnoreDup(keySelector, i => i, comparer);
public static Dictionary<TKey, TElement> ToDictionaryIgnoreDup<TSource, TKey, TElement>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer = null)
{
if (keySelector == null)
throw new ArgumentNullException(nameof(keySelector));
if (elementSelector == null)
throw new ArgumentNullException(nameof(elementSelector));
var d = new Dictionary<TKey, TElement>(comparer ?? EqualityComparer<TKey>.Default);
foreach (var element in source)
d[keySelector(element)] = elementSelector(element);
return d;
}
インデクサーのセットによってキーが追加されるため、スローされず、キーの検索も1回だけ行われます。IEqualityComparer
たとえば、それを与えることもできますStringComparer.OrdinalIgnoreCase
Dictionary<string, List<Person>>
(または同等の)が必要になります。