给出以下简单示例:
List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };
CaseInsensitiveComparer ignoreCaseComparer = new CaseInsensitiveComparer();
var distinctList = list.Distinct(ignoreCaseComparer as IEqualityComparer<string>).ToList();
看起来CaseInsensitiveComparer实际上并不用于进行不区分大小写的比较。
换句话说, distinctList 包含与列表相同数量的项目。相反,我希望,例如,“三”和“三”被认为是平等的。
我是否遗漏了某些东西,或者这是Distinct运算符的问题?
答案 0 :(得分:202)
StringComparer
可以满足您的需求:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
(或不变/序数/等取决于您要比较的数据)
答案 1 :(得分:4)
[如果你想要最简洁的方法,请参阅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 }
答案 2 :(得分:0)
这是一个更简单的版本。
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();
答案 3 :(得分:0)
## Distinct Operator( Ignoring Case) ##
string[] countries = {"USA","usa","INDIA","UK","UK" };
var result = countries.Distinct(StringComparer.OrdinalIgnoreCase);
foreach (var v in result)
{
Console.WriteLine(v);
}
OutPut将
USA
INDIA
UK