Причина, по которой вы получаете другой результат, заключается в том, что вы группируете не по строковому значению, а по групповой ссылке.При группировании строки обрабатываются не как строки, а как объекты, поэтому сравниваются только ссылки, а не содержимое.
Когда вы читаете значения из базы данных, каждая строка будет отдельным экземпляром, даже еслиони имеют одинаковую ценность.Например, первые две строки «AAA» будут отдельными объектами, а не ссылками на один и тот же объект.
Если вы не можете создать группу сетки для значений строки, использование String.Intern
является одним из способовстроки одинаковы, так что группировка работает в любом случае.
Однако вы можете использовать свой собственный метод создания строк одинаковых экземпляров, поскольку интернирование строк означает, что они никогда не будут собираться мусором.Вы можете использовать класс следующим образом:
public class LocalIntern {
private Dictionary<string, string> _intern = new Dictionary<string, string>();
public string Intern(string value) {
if (_intern.ContainsKey(value)) {
return _intern[value];
} else {
_intern.Add(value, value);
return value;
}
}
}
Когда вы снова заполняете сетку, вы просто создаете новый объект LocalIntern
, и строки, содержащиеся в предыдущем, можно собирать мусором.