【问题标题】:Linq - what locale/collation it uses to compare objects?Linq - 它使用什么语言环境/排序规则来比较对象?
【发布时间】:2010-10-03 07:32:21
【问题描述】:

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

例如

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

这里使用什么语言环境——当前的,不变的?我怎么能影响它? 比较好像不区分大小写,如果我想找到区分大小写的最大值怎么办?

【问题讨论】:

    标签: linq .net-3.5


    【解决方案1】:

    它在字符串中使用IComparable<string>的实现。

    您可以相当轻松地编写自己的 Max 版本,确实需要 IComparer<T> 进行比较 - 我很惊讶现在还没有。或者,您可以以一种有点麻烦的方式使用 Aggregate 来完成相同的结果。

    【讨论】:

    • 什么超载?我没有看到任何需要 IComparer:msdn.microsoft.com/en-us/library/… 的最大过载
    • 我很抱歉——你说得对。我将编辑我的答案。
    • 是的,聚合是不错的选择:max = files.Aggregate((a, b) => StringComparer.OrdinalIgnoreCase.Compare(a, b)
    【解决方案2】:

    我决定深入了解正在发生的事情。

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

    CultureInfo.CurrentCulture.CompareInfo.Compare(this, strB, CompareOptions.None);
    

    也就是说,你可以通过改变来影响 Max 方法的行为

    Thread.CurrentThread.CurrentCulture
    

    如果不可接受,您必须按照 Jon 的建议推出自己的 Max 版本。

    【讨论】:

      【解决方案3】:

      根据 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 2018-01-21
        相关资源
        最近更新 更多