Ash*_*Ash 90 c# linq string comparison distinct
给出以下简单示例:
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();
Run Code Online (Sandbox Code Playgroud)
似乎CaseInsensitiveComparer实际上并不用于进行不区分大小写的比较.
换句话说,distinctList 包含与列表相同数量的项目.相反,我希望,例如,"三"和"三"被认为是平等的.
我错过了什么,或者这是Distinct运营商的问题?
Mar*_*ell 212
StringComparer 做你需要的:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
Run Code Online (Sandbox Code Playgroud)
(或不变/序数/等取决于您要比较的数据)
[如果您想要最简洁的方法,请参阅Marc Gravells的回答]
经过调查并获得了Bradley Grainger的良好反馈,我实现了以下IEqualityComparer。它支持不区分大小写的Distinct()语句(只需将其实例传递给Distinct运算符):
Run Code Online (Sandbox Code Playgroud)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 }