按多个键分组并忽略大小写

时间:2014-06-12 00:22:00

标签: c# linq

当我尝试执行以下操作时,

collection.GroupBy(item => new
                        {
                            item.Item1,
                            item.Item2,
                            item.Item3,
                            item.Item4
                        }, StringComparer.CurrentCultureIgnoreCase)

我收到错误,无法从用法中推断出参数类型,并尝试明确指定类型参数。

这个的正确语法是什么?

2 个答案:

答案 0 :(得分:2)

顾名思义,StringComparer用于比较简单字符串,而不是匿名类型。

来自StringComparer上的MSDN页面:

  

表示使用特定案例和基于文化或序数的比较规则的字符串比较操作。

要比较您的课程,您可以创建自己的比较器:

public class CustomComparer : IEqualityComparer<SomeClass>
{
    public bool Equals(SomeClass x, SomeClass y)
    {
        return String.Equals(x.Item1, y.Item1, StringComparison.CurrentCultureIgnoreCase)
               && String.Equals(x.Item2, y.Item2, StringComparison.CurrentCultureIgnoreCase)
               && String.Equals(x.Item3, y.Item3, StringComparison.CurrentCultureIgnoreCase);
    }

    public int GetHashCode(SomeClass obj)
    {
        return string.Concat(obj.Item1.ToLower(),
                             obj.Item2.ToLower(),
                             obj.Item3.ToLower()).GetHashCode();
    }
}

并在GroupBy

中使用它
var collection = new List<SomeClass>();

// populate collection

collection.GroupBy(item => item, new CustomComparer());

这应该有用,虽然你可能需要玩它。

答案 1 :(得分:2)

您需要自定义比较器,StringComparer无法比较除字符串之外的任何内容 - 即无法与匿名类型进行比较。

快速解决方法是使用密钥中的ToUpper个字符串:

 collection.GroupBy(item => new
                    {
                        Item1 = item.Item1.ToUpper()
                        Item2 = item.Item2.ToString().ToUpper()
                    }); 

Item2的示例假设其类型不是字符串,因此首先调用ToString()。)