ปัญหากับที่สุดของคำตอบอื่น ๆ ที่พวกเขาใช้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>>
(หรือเทียบเท่า)