当我调用Linq(不是Linq-for-SQL,只是简单的内存Linq)时 - 它用来比较对象的区域设置,以及如何影响它?
E.g。
string[] a = { "a", "b", ... };
string max = a.Max();
这里使用的是什么语言环境 - 当前的,不变的?我怎么能影响它? 比较似乎不区分大小写,如果我想找到区分大小写的max?
答案 0 :(得分:3)
它在字符串中使用IComparable<string>
的实现。
您可以相当轻松地编写自己的Max版本,其中 需要IComparer<T>
进行比较 - 我很惊讶没有一个已经存在。或者,您可以以一种有点麻烦的方式使用Aggregate来完成相同的结果。
答案 1 :(得分:0)
我决定深入了解发生的事情。
Max方法使用Comparer类来比较项目。 Comparer类依次使用GenericComparer.Compare方法。此方法调用String.CompareTo方法。 CompareTo使用以下代码:
CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, CompareOptions.None);
也就是说,您可以通过更改
来影响Max方法的行为Thread.CurrentThread.CurrentCulture
如果这是不可接受的,你必须按照乔恩的建议推出自己的Max版本。
答案 2 :(得分:0)
根据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);