Информация об изменениях

Сообщение Re: Concat, Distinct по строке от 18.10.2023 12:54

Изменено 18.10.2023 12:58 vmpire

Re: Concat, Distinct по строке
Здравствуйте, 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>тем более в мсдн написано [url=https://learn.microsoft.com/ru-ru/dotnet/api/system.string.concat?view=net-7.0] такое [/url]
А это про другой Concat.

Слишком сложно пишете, от того и ошибки.

Попробуйте, например, изменить первый вариант на
[cs]
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()});
Re: Concat, Distinct по строке
Здравствуйте, 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()});