Linq - 用于比较对象的区域设置/归类?

时间:2009-01-24 10:07:39

标签: linq .net-3.5

当我调用Linq(不是Linq-for-SQL,只是简单的内存Linq)时 - 它用来比较对象的区域设置,以及如何影响它?

E.g。

string[] a = { "a", "b", ... };
string max = a.Max();

这里使用的是什么语言环境 - 当前的,不变的?我怎么能影响它? 比较似乎不区分大小写,如果我想找到区分大小写的max?

3 个答案:

答案 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);