GroupBy使用字符串值返回多个具有相同键

时间:2018-03-15 21:25:00

标签: c# sql-server linq character-encoding

尝试使用带有字符串值的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%假设”只是一个示例,而不是唯一具有多个分组的密钥。

enter image description here

1 个答案:

答案 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();

希望它有所帮助。