【发布时间】:2010-10-03 07:32:21
【问题描述】:
当我调用 Linq(不是 Linq-for-SQL,只是简单的内存中 Linq)时 - 它使用什么语言环境来比较对象,以及如何影响它?
例如
string[] a = { "a", "b", ... };
string max = a.Max();
这里使用什么语言环境——当前的,不变的?我怎么能影响它? 比较好像不区分大小写,如果我想找到区分大小写的最大值怎么办?
【问题讨论】:
当我调用 Linq(不是 Linq-for-SQL,只是简单的内存中 Linq)时 - 它使用什么语言环境来比较对象,以及如何影响它?
例如
string[] a = { "a", "b", ... };
string max = a.Max();
这里使用什么语言环境——当前的,不变的?我怎么能影响它? 比较好像不区分大小写,如果我想找到区分大小写的最大值怎么办?
【问题讨论】:
它在字符串中使用IComparable<string>的实现。
您可以相当轻松地编写自己的 Max 版本,确实需要 IComparer<T> 进行比较 - 我很惊讶现在还没有。或者,您可以以一种有点麻烦的方式使用 Aggregate 来完成相同的结果。
【讨论】:
我决定深入了解正在发生的事情。
Max 方法使用 Comparer 类来比较项目。比较器类又使用 GenericComparer.Compare 方法。此方法调用 String.CompareTo 方法。 CompareTo 使用以下代码:
CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, CompareOptions.None);
也就是说,你可以通过改变来影响 Max 方法的行为
Thread.CurrentThread.CurrentCulture
如果不可接受,您必须按照 Jon 的建议推出自己的 Max 版本。
【讨论】:
根据 Jon 的建议发布我的代码:
static T Max<T>(this IEnumerable<T> coll, IComparer<T> comp)
{
return coll.Aggregate((a, b) => comp.Compare(a, b) < 0 ? b : a);
}
它可以用作
string max = coll.Max(StringComparer.OrdinalIgnoreCase);
【讨论】: