Linq-它使用什么语言环境/排序规则来比较对象?

Linq-它使用什么语言环境/排序规则来比较对象?,linq,.net-3.5,Linq,.net 3.5,当我调用Linq时(不是SQL的Linq,只是简单的内存Linq)——它使用什么语言环境来比较对象,我如何影响它 例如 这里使用的是什么区域设置-当前,不变?我如何影响它? 比较似乎不区分大小写,如果我想查找区分大小写的max呢?它在字符串中使用了IComparable的实现 你可以很容易地编写自己版本的Max,它需要一个IComparer来进行比较——我很惊讶现在还没有。或者,您可以用一种有点麻烦的方式使用聚合来实现相同的结果。我决定更深入地了解发生了什么 Max方法使用Comparer类来比

当我调用Linq时(不是SQL的Linq,只是简单的内存Linq)——它使用什么语言环境来比较对象,我如何影响它

例如

这里使用的是什么区域设置-当前,不变?我如何影响它?
比较似乎不区分大小写,如果我想查找区分大小写的max呢?

它在字符串中使用了
IComparable
的实现


你可以很容易地编写自己版本的Max,它需要一个
IComparer
来进行比较——我很惊讶现在还没有。或者,您可以用一种有点麻烦的方式使用聚合来实现相同的结果。

我决定更深入地了解发生了什么

Max方法使用Comparer类来比较项目。Comparer类依次使用GenericComparer.Compare方法。此方法调用String.CompareTo方法。CompareTo使用以下代码:

CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, CompareOptions.None);
也就是说,您可以通过更改

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);
}

什么超载?我看不出有任何超负荷的max会让我失望。比较者:我很抱歉——你说得绝对正确。我将编辑我的答案。是的,聚合是一个很好的选择:max=files.Aggregate((a,b)=>StringComparer.OrdinalIgnoreCase.Compare(a,b)<0?b:a);
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);