当我尝试执行以下操作时,
collection.GroupBy(item => new
{
item.Item1,
item.Item2,
item.Item3,
item.Item4
}, StringComparer.CurrentCultureIgnoreCase)
我收到错误,无法从用法中推断出参数类型,并尝试明确指定类型参数。
这个的正确语法是什么?
答案 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()
。)