StringComparer
делает то, в чем Вы нуждаетесь:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
(или инвариант / порядковый / и т.д. в зависимости от данных Вы выдерживаете сравнение)
[Посмотрите, что Marc Gravells отвечает, хотите ли Вы самый краткий подход]
После некоторого расследования и хорошей обратной связи от Bradley Grainger, я реализовал следующий IEqualityComparer. Это поддерживает нечувствительный к регистру оператор Distinct () (просто передают экземпляр этого к оператору Distinct):
class IgnoreCaseComparer : IEqualityComparer<string> { public CaseInsensitiveComparer myComparer; public IgnoreCaseComparer() { myComparer = CaseInsensitiveComparer.DefaultInvariant; } public IgnoreCaseComparer(CultureInfo myCulture) { myComparer = new CaseInsensitiveComparer(myCulture); } #region IEqualityComparer<string> Members public bool Equals(string x, string y) { if (myComparer.Compare(x, y) == 0) { return true; } else { return false; } } public int GetHashCode(string obj) { return obj.ToLower().GetHashCode(); } #endregion }
Вот намного более простая версия.
List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };
var z = (from x in list select new { item = x.ToLower()}).Distinct();
z.Dump();