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