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

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

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

Re: Concat, Distinct по строке
Здравствуйте, e.thrash, Вы писали:

ET>Не пойму почему в случае Concat, Distinct по одинаковыми строкам возвращает 2 вместо 1.


ET>[cs]

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.

Слишком сложно пишете, от того и ошибки.
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()});