尝试使用带有字符串值的Linq GroupBy()
对象进行分组时,我遇到了一个奇怪的问题。
我正在尝试使用Value
属性对对象进行分组,这是一个字符串,如下所示:
objects.GroupBy(o => o.Value)
如果我这样做,我会得到比我更多的分组。例如,在代码中我得到〜150个组,其中许多组具有相同的键。但是,如果我在SQL Server中查询表:
SELECT DISTINCT Value FROM Object
我得到了57个左右的独特价值。
我认为可能存在导致此问题的编码问题。在弄乱了一些后我发现了这个:
objects.GroupBy(o => new Regex("").Replace(o.Value, string.Empty))
删除重复的值并匹配上面SQL查询的57个结果。数据库中的列定义为NVARCHAR(50)
。
检查和清理这些数据有什么好方法,所以这不是必需的?我还没有真正发现问题是什么,我只是偶然发现了一些有用的东西。我想更明确地找到这里发生的事情。
编辑,我使用此查询检查了分组:
var groups = objects.GroupBy(o => o.Value)
.Select(g => new { g.Key, Chars = g.Key.ToCharArray() })
.OrderBy(o => o.Key)
.ToList();
然后按照建议将char数组转换为int,重复的Keys在转换为整数值时具有相同的值。
并且有许多重复的组,没有明显的字符差异。有许多“100%假设”组,而其他组被分组为一个单独的键,就像它们应该的那样。注意“100%假设”只是一个示例,而不是唯一具有多个分组的密钥。
答案 0 :(得分:-1)
我相信它是因为" Chars = g.Key.ToCharArray()" 。
如果是我,我会在这种情况下使用区别而不是GroupBy,因为你使用"检查db方面的结果的方式。 SELECT DISTINCT Value FROM Object"。除非你稍后会做一些聚合。
所以我建议,在这种情况下:
var groups = objects
.Select(o => new { o.Value }).Distinct()
.Select(g => new { g.Value, Chars = g.Value.ToCharArray() })
.OrderBy(o => o.Value)
.ToList();
希望它有所帮助。