C# LINQ Distinct 运算符,忽略大小写?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/283063/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
LINQ Distinct operator, ignore case?
提问by Ash
Given the following simple example:
给出以下简单示例:
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();
It appears the CaseInsensitiveComparer is not actually being used to do a case-insensitive comparison.
看起来 CaseInsensitiveComparer 实际上并未用于进行不区分大小写的比较。
In other words distinctListcontains the same number of items as list. Instead I would expect, for example, "Three" and "three" be considered equal.
换句话说distinctList包含与list相同数量的项目。相反,我希望,例如,“三”和“三”被认为是平等的。
Am I missing something or is this an issue with the Distinct operator?
我是否遗漏了什么,或者这是 Distinct 运算符的问题?
采纳答案by Marc Gravell
StringComparer
does what you need:
StringComparer
做你需要的:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
(or invariant / ordinal / etc depending on the data you are comparing)
(或不变/有序/等,取决于您要比较的数据)
回答by Ash
[See Marc Gravells answer if you want the most concise approach]
[如果您想要最简洁的方法,请参阅 Marc Gravells 的回答]
After some investigation and good feedback from Bradley Grainger I've implemented the following IEqualityComparer. It suports a case insensitive Distinct() statement (just pass an instance of this to the Distinct operator) :
经过 Bradley Grainger 的一些调查和良好反馈后,我实现了以下 IEqualityComparer。它支持不区分大小写的 Distinct() 语句(只需将 this 的一个实例传递给 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 }
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 }
回答by Ash
Here is a far simpler version.
这是一个简单得多的版本。
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();
回答by Javed Ahmad
## 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 will Be
输出将是
USA
INDIA
UK