Как получить первые n элементов последовательности строк с split.take? VB .net - PullRequest
0 голосов
/ 14 сентября 2018

Я создал плагин .dll для AutoCAD и CIVIL 3D.

Я пытаюсь получить первые элементы этих последовательностей:

"Autodesk AutoCAD 2019 - [Рисунок 1]«Я просто хочу получить« Autodesk AutoCAD 2019 »(мне нужны первые 3 элемента) и« Autodesk CIVIL 3D 2019 - [Рисунок 1] »« Я просто хочу получить «Autodesk CIVIL 3D 2019».(Я хочу первые 4 элемента)

Я получаю эти последовательности, используя Process.GetCurrentProcess().MainWindowTitle, который извлекает заголовок окна приложения, которое я использую в данный момент.

Однако иногда я использую AutoCAD, другие используют CIVIL 3D, и я хочу получить имена их приложений в виде строк, отображаемых в окне сообщения, сообщая, какое приложение я использую в данный момент..

Я пытался использовать:

Process.GetCurrentProcess().MainWindowTitle.Substring(0, 22)

, но это не надежно, когда я отображаю окно сообщения в начале autocad или при закрытии.Это работает, только если я отображаю окно сообщения между началом и закрытием.

Думаю, мне следует попробовать:

Process.GetCurrentProcess().MainWindowTitle.Split.Take(4)

или

Process.GetCurrentProcess().MainWindowTitle.Take(4)

, но я могуКажется, он не работает, несмотря на то, что уже пытается это понять (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/return-or-skip-elements-in-a-...).

Как мне это сделать с помощью Take ???

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Я бы сделал:

Dim originalString As String = Process.GetCurrentProcess().MainWindowTitle

Dim splittedString As String() = originalString.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)

Dim productName As String = splittedString(0) 
0 голосов
/ 14 сентября 2018

Если вы собираетесь использовать Take, вам необходимо убедиться, что вы предоставили ему правильный ввод.Если вы сделаете это, то это даст правильный вывод.Вы действительно знаете, что это за входы и выходы?Входные данные - IEnumerable(Of T), а выходные данные - еще один IEnumerable(Of T), который содержит либо указанное количество элементов, либо все элементы из исходного списка, который когда-либо меньше.Это, очевидно, неправильно:

Process.GetCurrentProcess().MainWindowTitle.Take(4)

, потому что MainWindowTitle - это String, поэтому это означает, что ваш ввод будет IEnumerable(Of Char), поэтому вы просто получите первые четыре символа в строке.Это выглядит более многообещающе:

Process.GetCurrentProcess().MainWindowTitle.Split.Take(4)

Вы действительно проверили, что Split возвращает то, что вы думаете, что делает?Когда код работает так, как вы ожидаете, НИКОГДА не предполагайте ничего.Проверьте.

Кстати, Split - это метод, а не свойство.Вам не нужно использовать круглые скобки при вызове метода, если вы не предоставляете аргументов, но вы делаете это для GetCurentProcess, так почему бы вам не использовать Split?Несоответствие всегда плохо.Решите, что вы собираетесь делать, и делайте это в каждом случае.Лично я всегда включаю круглые скобки в вызов метода, для ясности есть аргументы или нет.Я не использую их в конструкторах без аргументов, потому что это можно спутать с созданием массива с первого взгляда.

В любом случае, как я уже сказал, если Split вернет правильный ввод, то Take обеспечитправильный вывод.Вопрос в том, знаете ли вы, что делать с этим выводом?Зачем ты это хочешь?IEnumerable(Of T) должен быть перечислен, чтобы иметь какое-либо применение, и то, как именно вы это сделаете, зависит от того, что именно вы хотите получить.Например, если вы хотите повторно объединить эти подстроки обратно в String с пробелами между ними, вы должны вызвать String.Join и передать список в качестве второго аргумента.Конечно, если вы собираетесь это сделать, то вам лучше воспользоваться другим моим предложением, то есть IndexOf и Split.

...