다른 답변의 대부분의 문제는 그들이 사용하는 것입니다 Distinct
, GroupBy
또는 ToLookup
후드 아래에 별도의 사전을 생성한다. 마찬가지로 ToUpper는 추가 문자열을 만듭니다. 이것은 내가 한 일이며 한 번의 변경을 제외하고는 거의 동일한 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;
}
인덱서의 집합으로 인해 키가 추가되므로 키가 발생하지 않으며 하나의 키 조회 만 수행됩니다. 당신은 또한 그에게를 제공 할 수 있습니다 IEqualityComparer
예를 들어,StringComparer.OrdinalIgnoreCase
Dictionary<string, List<Person>>
(또는 동등한) 필요합니다 .