|
.Net Core, обмен с 1C по TCP/IP между различными устройствами | ☑ | ||
---|---|---|---|---|
0
Serginio1
28.09.16
✎
12:10
|
Выложил статьи
http://catalog.mista.ru/public/551698/ https://habrahabr.ru/post/311128/ Примеры можно скачать здесь https://yadi.sk/d/jRSHEA19svgrn Решил написать кроссплатформенное решение из своего опыта 8 летней давности для обмена данными по TCP/IP между ТСД на Win CE и 1С еще 7-ки. Конечно, с 1С можно обмениваться через Web и HTTP-сервисы, но есть задачи, где нужно взаимодействие с оператором для выбора данных, брать данные, подготовленные на клиенте, печать на мобильный принтер. Основные проблемы связаны с сетями с плохим соединением на складах. Поэтому, нужно было уменьшить трафик за счет сжатия данных. Так, при работе в терминальных сессиях были проблемы с проброской портов в медленных сетях — Тормозит печать чека на фискальный регистратор через RDP. Также были проблемы при считывании двумерного штрихкода. Медленная печать с терминального сервера. Для решения этих проблем на машине клиента устанавливалась локальная 1С, которая работала как клиент и сервер. Данные со сканеров отправлялись на терминальный сервер и там обрабатывались. Для печати на фискальный регистратор отправлялись данные с сервера по TCP/IP, и с локальной 1С печатался чек. При печати этикеток с сервера оправлялись данные, на основании которых на локальной 1С формировался документ и отправлялся на печать. Кроме того, под многое оборудование для Linux нет драйверов. Можно, используя виртуализацию, держать Linux и Windows на одной машине, на Windows считывать данные и обмениваться с Linux по TCP/IP. Сейчас много у кого есть ТСД под WinCe, WinMo (недавно предлагали работу по настройке обмена на них). Кроме того, можно использовать ТСД на других осях, используя UWP и Xamarin. Кроме того, можно обмениваться сообщениями между клиентами 1С, наподобие чата. В большом .Net я часто использую обмен по TCp/IP http://catalog.mista.ru/public/238584/ http://catalog.mista.ru/public/525806/ |
|||
286
Serginio1
30.09.16
✎
16:15
|
(284) Так где ты возьмешь описание класса, если типизация динамическая. В 1С тоже есть автокомплит, но вот параметры и результат функции не типизирован
|
|||
287
Loky9
30.09.16
✎
16:16
|
(286) Там же где они берутся в динамиках и генериках.
|
|||
288
Serginio1
30.09.16
✎
16:19
|
(287) В динамиках как раз ничего не берется. Если конечно ты приведение типа не сделаешь.
В Дженериках там либо вывод типа по параметрам, либо нужно указывать тип. |
|||
289
Serginio1
30.09.16
✎
16:20
|
(288) Но у ExpandoObject или DynamicObject типы не известны
|
|||
290
trdm
30.09.16
✎
16:27
|
https://www.opennet.ru/opennews/art.shtml?num=45247
Анализатор PVS-Studio помог выявить 10000 ошибок в различных открытых проектах. .... Качество различных открытых проектов сильно отличается. Например, в недавних проверках проявил себя пакет NUnit, в котором удалось найти всего одну ошибку, порадовал высоким качеством кода и отладчик GDB. С другой стороны, при проверке Mono были выявлены сотни ошибок и возникли проблемы со сборкой. |
|||
291
trdm
30.09.16
✎
16:31
|
http://www.viva64.com/ru/b/0431/
Ищем ошибки в Mono: сотни их! static bool AreEqual (VisualStyleElement value1, VisualStyleElement value2) { return value1.ClassName == value1.ClassName && // <= value1.Part == value2.Part && value1.State == value2.State; } Приятного как коворится юзания :))) |
|||
292
trdm
30.09.16
✎
16:32
|
button_pressed_highlight = use_system_colors ?
Color.FromArgb (150, 179, 225) : Color.FromArgb (150, 179, 225); |
|||
293
trdm
30.09.16
✎
16:37
|
Что-бы не говорили, какой дотнет в усмертть кросплатформеный...
Сотни ошибок - это глюкавое ведро... |
|||
294
Garykom
гуру
30.09.16
✎
16:37
|
(291) Хорошая бага не всегда проявляющаяся кста ну забыли 1 на 2 исправить, бывает
|
|||
295
Garykom
гуру
30.09.16
✎
16:38
|
(293) Тя плафтормы 1С не удивляют?
|
|||
296
Serginio1
30.09.16
✎
16:50
|
(293) Ты сравнивай .Net Core. Mono уже считай умер. С NetStandart 2 все перейдут на .Net Core.
|
|||
297
Garykom
гуру
30.09.16
✎
16:54
|
(296) "Все" это кто? Полтора разраба корпоративных поделок? Которые не на java задумали писать?
|
|||
298
trdm
30.09.16
✎
17:03
|
(296) не, даром не надо.
|
|||
299
Serginio1
30.09.16
✎
17:34
|
(297) На самом деле их много. Как и на Asp.Net Core
|
|||
300
Serginio1
30.09.16
✎
17:43
|
Можно посмотреть по активности на http://stackoverflow.com/questions/tagged/asp.net-core-mvc
|
|||
301
Garykom
гуру
30.09.16
✎
17:44
|
(299) Пробовал писать сайт/сервисы на asp.net и да поначалу вау как круто!
Но потом начинаются грабли, то тут глючит не пойми почему то там, то нагрузку в 100 каких то юзеров не держит (хотя php или jsp легко) или просто взяло и повисло нафик что пришлось сервер ребутать. |
|||
302
Garykom
гуру
30.09.16
✎
17:47
|
(300) Если посмотреть "активность" тупых вопросов по 1С то легко можно подумать что все остальное во всем мире просто в загоне ))
Суть что на java или php достаточно просто погуглить, то на asp.net приходится спрашивать и не факт что ответ будет. |
|||
303
Serginio1
30.09.16
✎
17:49
|
(301) Ну это зависит от того как код напишешь. Сейчас в .Net Core практически выкинули все синхронные методы.
Многие еще потоки используют. (302) По Asp.Net на том же http://stackoverflow.com все легко находится. |
|||
304
Garykom
гуру
30.09.16
✎
17:51
|
(303) Счас то может и находится, но когда пробовал писать тогда был ужас, причем самый ужас что никаких бесплатных либ не было, только платные за огромные бабки.
В результате плюнул и перешел на яву, там либ оказалось море и с мануалами. |
|||
305
Garykom
гуру
30.09.16
✎
17:51
|
(304)+ Почему мне понравилась нода, что да технология новая но либ уже больше чем на C#
|
|||
306
Masquerade
30.09.16
✎
18:49
|
(304)
-- самый ужас что никаких бесплатных либ не было, -- там либ оказалось море и с мануалами -- что да технология новая но либ уже больше чем на C# О каких либах речь то идет? |
|||
307
Garykom
гуру
30.09.16
✎
18:58
|
(306) работа с офисными форматами xls, doc и прочие разные билиотеки для сетки, баз данных и прочего.
т.е. для всего что выходит за рамки лабораторно/учебного программирования, изначально C# это такая идеальная замена для языка обучения в школах/универах вместо устаревшего Паскаля и слишком сложных C++ |
|||
308
Garykom
гуру
30.09.16
✎
18:59
|
(307)+ Тем более что был (ну и есть но уже странно это) такой VB.Net как развитие VB6
|
|||
309
Masquerade
30.09.16
✎
19:00
|
(307)
изначально C# это такая идеальная замена для языка обучения в школах/универах Я просто был не в курсе |
|||
310
Garykom
гуру
30.09.16
✎
19:07
|
(309) Ну мне пришлось осваивать C# когда писал под WinMobile/WinCE ибо иначе никак (нативно это сдохнуть там было).
И тогда нифига не было, вот банальный FTP и нету (( что есть оно на PocketPC урезано по самое оказалось и полных либ не найти, пришлось на tcp/udp и http обмен переходить причем с 0 все изучая и ваяя. |
|||
311
Кирпич
30.09.16
✎
19:07
|
(305) да побойся бога. На шарпах уже все на свете понаписали.
|
|||
312
Gary417
30.09.16
✎
19:08
|
(307) C# этож "убийца явы", какойже это язык для обучения
|
|||
313
Garykom
гуру
30.09.16
✎
19:10
|
(311) сам язык и .net фреймворк вышли на удивление удобными
на том же паскале-дельфи писать менее удобно оказалось |
|||
314
Serginio1
30.09.16
✎
19:11
|
(307) Видно это давно было. Есть и Open XML.
Если не было на C? то был интероп. Особенно на WinMobile/WinCE. Сейчас многое все поменялось. |
|||
315
Garykom
гуру
30.09.16
✎
19:11
|
(312) ну рынок у явы он отжал это не поспоришь
|
|||
316
Garykom
гуру
30.09.16
✎
19:12
|
(314) 10 лет уже как
|
|||
317
Serginio1
30.09.16
✎
19:12
|
(313) Я сам с огромным сожалением оставл Delphi в прошлом.
|
|||
318
Garykom
гуру
30.09.16
✎
19:15
|
(317) угу чего мне сча реально не хватает так это C# + Lazarus, в смысле писать на C# и компиляция под любые платформы в нативный код ((
|
|||
319
Garykom
гуру
30.09.16
✎
19:16
|
(318)+ Без громоздких .Net Framework'ов чтобы запускалось нативно.
Java кстати тоже сча пипец уже с размерами... |
|||
320
Serginio1
30.09.16
✎
19:16
|
(318) Сейчас есть .Net Native. Но, он только вначале пути.
|
|||
321
Garykom
гуру
30.09.16
✎
19:17
|
(320) не взлетит он, не смогут перелопатить весь .Net никак, а без этого смысла уже мало, мощщи классов/либ будет не хватать привычной.
|
|||
322
Gary417
30.09.16
✎
19:18
|
(321) ну всё зависит от желания МС выйти на линукс
|
|||
323
Serginio1
30.09.16
✎
19:21
|
(321) Уже лопатят. .Net Core
https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/ |
|||
324
Serginio1
30.09.16
✎
19:21
|
(322) Так у них есть смысл в облаках. Они там кучу денег зарабатывают.
|
|||
325
Gary417
30.09.16
✎
19:25
|
(324) а причём тут облака и .Net?
|
|||
326
Garykom
гуру
30.09.16
✎
19:37
|
Кста кто еще удивился что MS для своей мобильно-телефонной платформы не додумались реализовать AndroidJava машину?
Или додумались но не смогли? Так бы куча софта/игрушек сразу были для Windows Phone и покупали бы на ура. А то ценник сча смешной (как и на планшеты с Windows 10) но не берутс. Сам взял для отделов более дорогие (хуже технически/функционально) планшеты но зато с Android а не с Windows 10. Ибо повозился и плюнул, нафик мне траблы от отделов. |
|||
327
Gary417
30.09.16
✎
19:38
|
(326) вообщето они хотели, но проект прикрыли
|
|||
328
Gary417
30.09.16
✎
19:39
|
Project Astoria называлось вродбы
|
|||
329
Garykom
гуру
30.09.16
✎
19:39
|
(327) Не-не то что читал то было полный эмулятор android'а включая натив софт а не только под Далвик
|
|||
330
Serginio1
30.09.16
✎
19:48
|
(326) А при том, что они туда перетягивают Linux и прочее и дают свои инструмены.
|
|||
331
Masquerade
30.09.16
✎
19:59
|
(266)
В лоб. Чтоб понятно было. var string_array = new String[] {"hello", "I prefer Jelly Belly beans.", "When hell freezes over!" }; var min_word = string_array.OrderBy(x => x.Length).FirstOrDefault(); var all_indexes = Enumerable.Range(0, min_word.Length+1); var index_pairs = from index1 in all_indexes from index2 in all_indexes where index1 < index2 select new { start = index1, end = index2 }; var all_variations = from index_pair in index_pairs select new { result = min_word.Substring(index_pair.start, index_pair.end - index_pair.start) }; var _max_substring = from variant in all_variations from word in string_array select new { variant_length = variant.result.Length, substring = variant.result, present = word.IndexOf(variant.result)>-1 ,word = word }; var max_substring = _max_substring. Where(x => x.present). GroupBy(x=>x.substring). Where(x=>x.Count()==string_array.Count()). OrderByDescending(x=>x.Key.Length). FirstOrDefault(). Key; Console.Out.WriteLine(max_substring); |
|||
332
Masquerade
30.09.16
✎
20:00
|
(331) +
Можно и в a la одну строчку, но тутошний народец этого не любит)))))) |
|||
333
Serginio1
30.09.16
✎
20:10
|
(326) Да вроде есть https://www.ikvm.net/
Но проблема не в софте. Там и сейчас софта хватает, и аппараты цена качество отменное. Просто народ уже подсел на андроид Ios |
|||
334
Masquerade
30.09.16
✎
20:20
|
(266)
Покороче var string_array = new String[] {"hello", "I prefer Jelly Belly beans.", "When hell freezes over!" }; var all_variations = from start in Enumerable.Range(0, string_array.OrderBy(x => x.Length).FirstOrDefault().Length + 1) from end in Enumerable.Range(0, string_array.OrderBy(x => x.Length).FirstOrDefault().Length + 1) where start < end select new { result = string_array.OrderBy(x => x.Length).FirstOrDefault().Substring(start, end - start) }; var max_substring = String.Empty; foreach (var variant in all_variations.OrderByDescending(x => x.result.Length)) { if (string_array.Select(word => word.IndexOf(variant.result) > -1 ? 1 : 0).Sum() == string_array.Count()) { max_substring = variant.result; break; } } Console.Out.WriteLine(max_substring); |
|||
335
Serginio1
30.09.16
✎
20:49
|
(334) Добавил в PasteBin
<iframe src="//pastebin.com/embed_iframe/jPaqH4dX" style="border:none;width:100%"></iframe> http://pastebin.com/jPaqH4dX |
|||
336
Loky9
30.09.16
✎
22:03
|
(331) Спасибо! Это было познавательно.
(334) (335) И какой вывод можно сделать? |
|||
337
Serginio1
30.09.16
✎
22:49
|
Что в 1С не хватает Linq to SQL и Linq to Object
|
|||
338
Loky9
30.09.16
✎
22:52
|
(337) И статической типизации, конечно же.
|
|||
339
Loky9
30.09.16
✎
23:11
|
Немного побаловался с тем кодом, найденным в инете:
from itertools import permutations def long_substr(data): first, substr = data[0], '' if len(data) > 1 and len(first) > 0: for i, j in permutations(range(len(first) + 1), 2): if j - i > len(substr) and all(first[i:j] in x for x in data): substr = first[i:j] return substr print(long_substr(['hello', 'I prefer Jelly Belly beans.', 'When hell freezes over!'])) |
|||
340
Masquerade
30.09.16
✎
23:51
|
(339)
Тю, так ты еще и в нете код ищешь, а потом сюда постишь... |
|||
341
Loky9
01.10.16
✎
00:00
|
(340) Когда как. Не вижу проблемы.
|
|||
342
Loky9
01.10.16
✎
00:15
|
http://pastebin.com/qsyyjE1N - 100% моё, чтоб вопросов не было. С блэкджеком и ОРМ.
|
|||
343
Masquerade
01.10.16
✎
00:49
|
(342)
Да что там подстроку искать - скука. Вот была задача - есть массив адресов. Один адрес - одна строка. Надо выдрать первую букву улицы/проспекта/площади. На LINQ несколько строк.)))) |
|||
344
Masquerade
01.10.16
✎
00:49
|
(343)
-- На LINQ несколько строк. Не самых коротких, правда)))) |
|||
345
Serginio1
01.10.16
✎
10:49
|
Нужно иметь ввиду, что Linq расширяем за счет своих методов расширителей. Например
http://rsdn.org/forum/prj.codejam/6569269.flat |
|||
346
Masquerade
01.10.16
✎
11:15
|
(345)
Это ты к чему? |
|||
347
Serginio1
01.10.16
✎
12:26
|
(346) Я к тому, что стандартная библиотека прежде всего направлена на Sql. Да и там много не хватает. Но она расширяема.
Например в C++ можно найти минимальное значение для любого типа. В .Net метод Min только для числовых https://msdn.microsoft.com/ru-ru/library/system.linq.enumerable.min(v=vs.110).aspx Но можно расширить например http://rsdn.org/forum/dotnet/6506104.1 В данном случае вместо Enumerable.Range(0, string_array.OrderBy(x => x.Length).FirstOrDefault().Length + 1) Можно написать Enumerable.Range(0, string_array.MinItem(x => x.Length).Length + 1) |
|||
348
Serginio1
01.10.16
✎
12:40
|
А вообще то для данного случая нужно было тспользовать
Enumerable.Range(0, string_array.Min(x => x.Length)+ 1) https://msdn.microsoft.com/ru-ru/library/bb548864(v=vs.110).aspx |
|||
349
Masquerade
01.10.16
✎
14:00
|
(348)
Так можно и всю задачу решить ОДНИМ методом расширения. И то что "стандартная библиотека направлена на SQL" - это твои фантазии. И "вообще-то" тебе предложили написать код - ты слился в лучших традициях. Так что незачет. |
|||
350
Loky9
01.10.16
✎
14:14
|
(343) [i.group(1) for i in map(re.compile(r'(?:\s+|\A)(?:ул|пр-кт|пл)(?:\.|\s+)\s*(\w)', re.I).search, adresses) if i]
Всего делов. |
|||
351
Loky9
01.10.16
✎
16:08
|
(286) В питоне3 появился type hinting. Рантайм типы не проверяются, но любые нуждающиеся средства могут получить подсказку по типу аргумента. IDE это используют
http://savepic.su/7534189.png |
|||
352
Serginio1
01.10.16
✎
21:59
|
(349) Нет не фатазии. Ибо стандартный Linq подходит под IQueryable
https://habrahabr.ru/post/256821/ Что касается Enumerable.Range(0, string_array.MinItem(x => x.Length).Length + 1 То это стандартный метод. А насчет слился считай как хочешь. (351) Вот интересно. Идут по пути TypeScript. Чего и 1С нужно брать на вооружение |
|||
353
Masquerade
01.10.16
✎
22:02
|
(350)
Ты такой простой. Ты не знаешь, как заданы эти сокращения, улица может быть как ул. у-ца улица и прочее. С проспектами и площадями - тоже самое. Максимум что известно, что способ (формат) более менее одинаков. |
|||
354
Serginio1
01.10.16
✎
22:03
|
(349)
Я не знаю чего ты так возмутился Я просто привел стандартный Linq метод string_array.Min(x => x.Length) https://msdn.microsoft.com/ru-ru/library/bb548864(v=vs.110).aspx Вместо string_array.OrderBy(x => x.Length).FirstOrDefault().Length |
|||
355
Loky9
01.10.16
✎
22:13
|
(353) Обычно всё что не определено во вводной берётся на своё усмотрение. Я усмотрел из "Приложение 1 к описанию классификатора адресов Российской Федерации (КЛАДР)". Если однозначно определить вхождение элемента невозможно, задача не решается.
Так что добавьте недостающие варианты в регулярку и не имейте мне мозг. |
|||
356
Masquerade
01.10.16
✎
22:20
|
(355)
-- и не имейте мне мозг. Да больно надо, это не я код из нета сюда пощу с лозунгами :"А ну-ка, девочки!" Это был чисто спортивный интерес - вычислить паттерн формата адреса и извлечь из него искомое. |
|||
357
Loky9
01.10.16
✎
22:24
|
(356) С конкретно тем кодом был подтекст спецом для Garykom
Успехов в освоении регулярок! |
|||
358
Masquerade
02.10.16
✎
00:54
|
(355)
--Если однозначно определить вхождение элемента невозможно, _задача не решается_. Тобой.))) Это значит, что регулярка не работает. А по другому ты не умеешь. Признаешь? |
|||
359
Loky9
02.10.16
✎
00:56
|
(358) Я могу эту примитивную задачу решать как угодно. Хватит понтов.
|
|||
360
Loky9
02.10.16
✎
00:57
|
Неточные методы дают неточные решения. Только и всего.
|
|||
361
Loky9
02.10.16
✎
01:07
|
(344) Жду обещанного решения на LINQ "в несколько строк" уже для строк произвольного формата.
Осилишь? |
|||
362
Masquerade
02.10.16
✎
10:14
|
(361)
А ты в нете поищи. |
|||
363
Loky9
02.10.16
✎
10:15
|
(362) Быстро ты слился.
|
|||
364
Masquerade
02.10.16
✎
10:28
|
(363)
Тебе хватит и того бисера, что я уже наметал |
|||
365
Loky9
02.10.16
✎
10:30
|
Пока вывод: LINQ - громоздкое, бесполезное унылое уг.
|
|||
366
Serginio1
02.10.16
✎
12:12
|
(365) Ну тебе виднее. Огромная куча народа использует в том числе и для SQL. Намного удобнее 1С кого конструктора итд.
|
|||
367
Mauser
02.10.16
✎
22:40
|
(366) Когда очередную статью на хабре ждать?
|
|||
368
Serginio1
03.10.16
✎
10:05
|
(367) Наверное когда уже выйдет .Net Core 1.1
Или, что маловероятно, когда 1С добавит возможность передавать в параметрах и возвращать объекты ВК. Сейчас займусь Xamarin. Посмотрю, что изменилось с времен 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям Если появится, что то интересное, то тоже напишу |
|||
369
Loky9
03.10.16
✎
12:09
|
(366) Виднее. Смотри, берём код (331) и дословно транслируем:
from itertools import groupby string_array = ['hello', 'I prefer Jelly Belly beans.', 'When hell freezes over!'] min_word = min(string_array, key=len) all_indexes = range(len(min_word)) index_pairs = [(index1, index2) for index1 in all_indexes for index2 in all_indexes if index1 < index2] all_variations = [min_word[start:end] for start, end in index_pairs] _max_substring = [(len(variant), variant, variant in word, word) for variant in all_variations for word in string_array] max_substring = max((gkey for gkey, grp in groupby(sorted(filter(lambda x: x[2], _max_substring), key=lambda x: x[1]), key=lambda x: x[1]) if len(tuple(grp)) == len(string_array)), key=len) print(max_substring) Исключительно на базовых средствах получилось более кратко. |
|||
370
Serginio1
03.10.16
✎
13:22
|
(369) Тоже самое и с Linq
Там легко расширить. И вместо min_word = min(string_array, key=len) all_indexes = range(len(min_word)) index_pairs = [(index1, index2) index_pairs=Enumerable.Range(0, string_array.Min(x => x.Length- 1); Все остальное как в .Net Core, обмен с 1C по TCP/IP между различными устройствами Большой разницы не вижу. Особенно если ввести MinItem. Вместо string_array.OrderBy(x => x.Length).FirstOrDefault() string_array.MinItem(x => x.Length) Даже еще короче получится. А вот читаемость у Linq лучше. При этом Автодополнение итд. Кратко, не значит понятно. |
|||
371
Loky9
03.10.16
✎
21:42
|
(370) " Тоже самое и с Linq
Там легко расширить." С другой стороны тоже можно расширить: from itertools import permutations, product, groupby def group_by(iterable, **kwargs): for key, grp in groupby(sorted(iterable, **kwargs), **kwargs): yield key, tuple(grp) string_array = [ 'hello', 'I prefer Jelly Belly beans.', 'When hell freezes over!'] min_word = min(string_array, key=len) all_variations = ( min_word[start:end] for start, end in permutations(range(len(min_word)), 2)) usable_vars = ( variant for variant, word in product(all_variations, string_array) if variant in word) max_substring = \ max((gkey for gkey, grp in group_by(usable_vars) if len(grp) == len(string_array)), key=len) print(max_substring) Кому хочется большего пишут свои линки ( https://github.com/heynemann/pynq/wiki ), или используют бронебойный http://pandas.pydata.org/pandas-docs/stable/10min.html "А вот читаемость у Linq лучше." Я бы не сказал. Ни SQL, ни функциональный стиль, куча дополнительных ключевых слов и с ними правил синтаксиса, борьба с типизацией. "Кратко, не значит понятно." Не значит, но зачастую сопутствует. |
|||
372
Serginio1
03.10.16
✎
22:45
|
(371) Там синтаксиси именно под SQL, но сделан для того, что бы использовать intellisense.
B код под коллекции так же работает и с Таблицами SQL http://catalog.mista.ru/public/402433/ >> Я бы не сказал. Ни SQL, ни функциональный стиль, куча дополнительных ключевых слов и с ними правил синтаксиса, борьба с типизацией. Дело привычки, а автодополнение сокращает время написания и количество синтаксических ошибок. Лень вчитываться, а каков смысл твоего алгоритма? |
|||
373
Loky9
03.10.16
✎
23:21
|
(372) "Лень вчитываться, а каков смысл твоего алгоритма?"
Это всё ещё алгоритм Masquerade . Он берёт самую короткую строку из набора и генерирует все возможные её подстроки. Из полученного набора подстрок отбирает входящие во все строки, а из входящих самую длинную. В итоге получаем самую длинную общую подстроку, о чем спрашивали в Быстрый алгоритм наибольших общих подстрок . Не самый оптимальный алгоритм даже для ложащихся на логику РБД, но он таки с БД работать может. |
|||
374
Garykom
гуру
03.10.16
✎
23:59
|
(373) Интересный алгоритм задачка приводится на sql к куче like'ов
И если слегка допилить то можно реализовать "группировку" по общим подстрокам. |
|||
375
Serginio1
04.10.16
✎
00:31
|
(373) Спасибо. Теперь понятно.
А что касается формирования подстрок, то там и без Linq можно обойтись. Опустим. Сравним Linq foreach (var variant in all_variations.OrderByDescending(x => x.result.Length)) { if (string_array.Select(word => word.IndexOf(variant.result) > -1 ? 1 : 0).Sum() == string_array.Count()) { max_substring = variant.result; break; } } и Питон _max_substring = [(len(variant), variant, variant in word, word) for variant in all_variations for word in string_array] max_substring = max((gkey for gkey, grp in groupby(sorted(filter(lambda x: x[2], _max_substring), key=lambda x: x[1]), key=lambda x: x[1]) if len(tuple(grp)) == len(string_array)), key=len) |
|||
376
Serginio1
04.10.16
✎
01:20
|
Или
if (string_array.Select(word => word.IndexOf(variant.result) > -1 ? 1 : 0).Sum() == string_array.Count()) Можно переписать if (string_array.Count(word => word.IndexOf(variant.result) > -1 ) == string_array.Count()) |
|||
377
Loky9
04.10.16
✎
08:18
|
(375) "Сравним Linq
и Питон" Ты сравниваешь различные конструкции. Приведённой тобой линковой соответствует for variant in sorted(all_variations, key=len, reverse=True): if sum(variant in word for word in string_array) = len(string_array): max_substring = variant break |
|||
378
Serginio1
04.10.16
✎
09:47
|
Ну давай сравним
if sum(variant in word for word in string_array) = len(string_array): и if (string_array.Count(слово=> слово.IndexOf(variant) > -1 ) == string_array.Count()) |
|||
379
Serginio1
04.10.16
✎
09:51
|
По сути это сокращенная Sql инсnруция
if (string_array.Where(слово=> слово.IndexOf(variant) > -1 ).Count() == string_array.Count()) |
|||
380
Loky9
05.10.16
✎
10:41
|
(378) Хочешь сказать линк тут понятнее? Или короче?
|
|||
381
Serginio1
05.10.16
✎
10:47
|
(380) Понятнее. Мало того эта же конструкция прекрасно ложится на SQL
|
|||
382
Loky9
05.10.16
✎
10:51
|
(381) Одна конструкция ложится на другую, но на SQL ложатся не обе? ) Так бывает? Там ещё и кириллицей тоже можно.
|
|||
383
Serginio1
05.10.16
✎
11:03
|
Вернее будет правильнее
if (string_array.Count(слово=> слово.Contains(variant) > -1 ) == string_array.Count()) А, что Unicode в SQL отменили? Но IndexOf работает, прорсто Contains короче http://stackoverflow.com/questions/835790/how-to-do-sql-like-in-linq |
|||
384
Serginio1
05.10.16
✎
11:04
|
Тьфу Копи пасте
if (string_array.Count(слово=> слово.Contains(variant)) == string_array.Count()) |
|||
385
Serginio1
05.10.16
✎
11:06
|
А внутри SQL кстати не будет никакой Киррилицы.
Почитай для интереса Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I http://catalog.mista.ru/public/393228/ Продолжение здесь http://catalog.mista.ru/public/402038/ Здесь лежит практика использования http://catalog.mista.ru/public/402433/ |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |