Здравствуйте, e.thrash, Вы писали:
ET>Не пойму почему в случае Concat, Distinct по одинаковыми строкам возвращает 2 вместо 1.
ET>ET>internal class Program
ET>{
ET> private static void Main(string[] args)
ET> {
ET> var dt1 = new dt()
ET> {
ET> id = 1,
ET> ds = "20220101",
ET> de = "20220202"
ET> };
ET> var dt2 = new dt()
ET> {
ET> id = 1,
ET> ds = "20220101",
ET> de = "20220202"
ET> };
ET> var l = new List<dt>();
ET> l.Add(dt1);
ET> l.Add(dt2);
ET> //cnt = 2 ?
ET>
var s = l.GroupBy(dt => dt.id).Select(b =>
new { Key = b.Key, cnt = b.Select(d => d.ds.Concat(d.de)).Distinct().Count() });
ET>
//cnt = 1
ET>
var s2 = l.GroupBy(dt => dt.id).Select(b =>
new { Key = b.Key, cnt = b.Select(d => d.ds + d.de).Distinct().Count() });
ET> }
ET>}
потому, что в первом случае Concat соединяет не строки, а энумераторы символов, получая новый энумератор. А два энумератора считаются различными объектами, даже если они на выходе дают одинаковый результат.
ET>тем более в мсдн написано такое
А это про другой Concat.
Слишком сложно пишете, от того и ошибки.
Попробуйте, например, изменить первый вариант на
var s = l.GroupBy(dt => dt.id).Select(b => new { Key = b.Key, cnt = b.Select(d => new string(d.ds.Concat(d.de).ToArray())).Distinct().Count()});