Как получить первые n элементов последовательности строк с помощью split.take? ВБ .нет

Я создал подключаемый модуль .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)

or

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

но я не могу заставить его работать, несмотря на то, что уже пытаюсь его понять (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/return-или-пропустить-элементы-в-...).

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

Огромное спасибо!


person Rita Aguiar    schedule 14.09.2018    source источник
comment
Эм, разве ты на самом деле не хочешь того, что стоит перед тире? Если это так, то логично получить индекс тире, а затем получить подстроку до этого индекса. Либо так, либо просто разделить на тире и получить первую подстроку. Затем вы можете захотеть Trim результат.   -  person jmcilhinney    schedule 14.09.2018
comment
@gmcilhinney Спасибо. Это отличная идея. Насколько точно? Я пробовал: Process.GetCurrentProcess().MainWindowTitle.Substring(0, IndexOf(-)) но я должен делать что-то не так   -  person Rita Aguiar    schedule 14.09.2018
comment
Вы должны вызвать IndexOf для String, содержащего символ, индекс которого вы хотите найти. Получите MainWindowTitle и назначьте его переменной, а затем используйте эту переменную столько раз, сколько вам нужно, т.е. вызовите для нее IndexOf и Substring.   -  person jmcilhinney    schedule 14.09.2018


Ответы (2)


Я бы сделал:

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

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

Dim productName As String = splittedString(0) 
person ɐsɹǝʌ ǝɔıʌ    schedule 14.09.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.

person jmcilhinney    schedule 14.09.2018
comment
Я всегда проверяю. Process.GetCurrentProcess().MainWindowTitle.Split.Take(4) не работает, потому что я неправильно понимаю аргументы Take. Process.GetCurrentProcess().MainWindowTitle.Split также не работает по той же причине, что-то упущено. Я читал о Split и Split.Take and Take. Но я не совсем понимаю (я новичок в VB). - person Rita Aguiar; 14.09.2018
comment
Нет такого понятия, как Split.Take. Существует метод String.Split, который разбивает String на массив подстрок с одним или несколькими разделителями. Существует метод Enumerable.Take, который принимает общий перечисляемый список и возвращает общий перечисляемый список того же типа, содержащий до указанного количества элементов с начала ввода. - person jmcilhinney; 14.09.2018
comment
Как насчет того, чтобы перестать быть таким расплывчатым? Что ТОЧНО возвращает MainWindowTitle? Это то, что вы ожидаете, и если нет, то чем оно отличается? Если да, то что возвращает Split? Это то, что вы ожидаете, и если нет, то чем оно отличается? Если да, то что возвращает Take? Это то, что вы ожидаете, и если нет, то чем оно отличается. Мы не экстрасенсы. Вы должны предоставить нам соответствующую информацию. Сказать, что что-то не работает, никогда, НИКОГДА не достаточно. Вам нужно ТОЧНО указать, что вы ожидаете, и что происходит на самом деле. - person jmcilhinney; 14.09.2018
comment
Метод Split будет разделяться на пробельные символы, если вы не предоставите аргументы, поэтому то, что вы делаете, должно работать нормально. То, как вы звоните Take, тоже выглядит нормально, судя по предоставленной вами информации. Я подозреваю, что вы просто не знаете, как использовать IEnumerable(Of T), но это всего лишь предположение, потому что вы не предоставили надлежащего описания проблемы. - person jmcilhinney; 14.09.2018
comment
Я сказал это в своем вопросе. MainWindowTitle извлекает: Autodesk AutoCAD 2019 — [Чертеж 1] или Autodesk CIVIL 3D 2019 — [Чертеж 1]. Но я хотел, чтобы он извлекал: Autodesk AutoCAD 2019 или Autodesk CIVIL 3D 2019 - person Rita Aguiar; 14.09.2018
comment
Причина, по которой я это говорю, заключается в том, что, основываясь на вашем OP, вы, кажется, думаете, что можете заменить выражение, которое возвращает String, выражением, которое возвращает IEnumerable(Of String), чего вы очень не можете. - person jmcilhinney; 14.09.2018
comment
Я сказал это в своем вопросе. Гм, вы заметили, как я задал больше вопросов после этого? Если я буду вытягивать информацию из вас, брыкаясь и крича, то я очень скоро сдамся. Предоставьте ПОЛНОЕ и ЯСНОЕ описание проблемы. Я больше ничего не буду вносить, пока вы не сделаете. - person jmcilhinney; 14.09.2018
comment
Спасибо. Проблема в том, что я новичок в VB и даже не знаю, как написать одну строку кода. Это крутая кривая обучения, и я только начал на прошлой неделе. - person Rita Aguiar; 14.09.2018
comment
Как я уже сказал, я новичок в VB, извините, если я не могу предоставить лучшее описание. - person Rita Aguiar; 14.09.2018
comment
Конечно, есть чему поучиться. Хотя есть способы этому научиться. Больше всего меня раздражает количество людей, которые полностью игнорируют тот факт, что в VS есть меню «Справка», а также предоставляется контекстно-зависимая помощь с помощью клавиши F1, как это делала Windows на протяжении десятилетий. Вы использовали это, чтобы прочитать документацию для методов Split и Take, чтобы увидеть, как именно они работают? Это не всегда решит все ваши проблемы, но это то, что каждый разработчик должен делать в первую очередь каждый раз, когда ему нужна помощь. - person jmcilhinney; 14.09.2018
comment
Спасибо за информацию. Я пользовался справкой и читал страницы «Раздели и возьми», но все равно не мог понять правильно. Извиняюсь. Я не разработчик. Я архитектор. - person Rita Aguiar; 14.09.2018
comment
Вы могли; вы просто не сделали. Ты не одинок. Люди, как правило, не слишком задумываются о том, что может понадобиться другим людям, чтобы помочь им. Например, если что-то не работает, есть три возможности: вы получаете ошибку компиляции, вы получаете исключение во время выполнения или вы получаете неожиданный результат. Все три из них легко передать нам. Прежде чем обращаться за помощью, просмотрите ВСЮ имеющуюся у вас информацию и спросите себя, что из этого было бы полезно для нас. Сообщения об ошибках и фактическое поведение кода, очевидно, относятся к категории полезных. - person jmcilhinney; 14.09.2018
comment
Я сделаю это в следующий раз. Спасибо - person Rita Aguiar; 14.09.2018