如何用split.take得到字符串序列的前n个元素? VB.net
How to get the first n elements of string sequence with split.take? VB .net
我为 AutoCAD 和 CIVIL 3D 创建了一个 .dll 插件。
我正在尝试检索这些序列的第一个元素:
"Autodesk AutoCAD 2019 - [Drawing 1]" 我只想获得 "Autodesk AutoCAD 2019" (我想要前 3 个元素)
和
"Autodesk CIVIL 3D 2019 - [Drawing 1]"我只想获得"Autodesk CIVIL 3D 2019"。 (我想要前 4 个元素)
我通过使用 Process.GetCurrentProcess().MainWindowTitle
获取这些序列,它检索我目前正在使用的应用程序的 window 标题。
但是,有时我使用 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应该怎么做???
非常感谢!
如果您要使用 Take
,那么您必须确保为其提供正确的输入。如果您这样做,那么它将提供正确的输出。你真的知道那些输入和输出是什么吗?输入是一个 IEnumerable(Of T)
,输出是另一个 IEnumerable(Of T)
,它包含指定数量的项目或原始列表中的所有项目,以较小者为准。
这显然是错误的:
Process.GetCurrentProcess().MainWindowTitle.Take(4)
因为 MainWindowTitle
是一个 String
,所以这意味着您的输入将是一个 IEnumerable(Of Char)
,所以您只会得到字符串中的前四个字符。这看起来更有希望:
Process.GetCurrentProcess().MainWindowTitle.Split.Take(4)
你真的检查过 Split
returns 你认为它的作用吗?当代码按预期工作时,永远不要假设任何事情。检查。
顺便说一下,Split
是一种方法,而不是 属性。当不提供任何参数时,您不必在方法调用中使用括号,但您这样做是为了 GetCurentProcess
那么为什么不为 Split
呢?不一致总是不好的。决定你要做什么,并在任何情况下都去做。就个人而言,为了清楚起见,无论是否有参数,我总是在方法调用中包含括号。不过,我不会在没有参数的构造函数上使用它们,因为乍看之下它可能与数组创建混淆。
无论如何,正如我所说,如果 Split
returns 正确的输入那么 Take
将提供正确的输出。问题是,您知道如何处理该输出吗?你要它干什么?需要枚举一个 IEnumerable(Of T)
才能有任何用处,具体如何操作取决于您最终想要得到什么。例如,如果您想将这些子字符串重新连接回 String
并在它们之间留有空格,那么您可以调用 String.Join
并将列表作为第二个参数传递。当然,如果你打算这样做,那么你最好接受我的其他建议,即 IndexOf
和 Split
.
我会做:
Dim originalString As String = Process.GetCurrentProcess().MainWindowTitle
Dim splittedString As String() = originalString.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
Dim productName As String = splittedString(0)
我为 AutoCAD 和 CIVIL 3D 创建了一个 .dll 插件。
我正在尝试检索这些序列的第一个元素:
"Autodesk AutoCAD 2019 - [Drawing 1]" 我只想获得 "Autodesk AutoCAD 2019" (我想要前 3 个元素) 和 "Autodesk CIVIL 3D 2019 - [Drawing 1]"我只想获得"Autodesk CIVIL 3D 2019"。 (我想要前 4 个元素)
我通过使用 Process.GetCurrentProcess().MainWindowTitle
获取这些序列,它检索我目前正在使用的应用程序的 window 标题。
但是,有时我使用 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应该怎么做???
非常感谢!
如果您要使用 Take
,那么您必须确保为其提供正确的输入。如果您这样做,那么它将提供正确的输出。你真的知道那些输入和输出是什么吗?输入是一个 IEnumerable(Of T)
,输出是另一个 IEnumerable(Of T)
,它包含指定数量的项目或原始列表中的所有项目,以较小者为准。
这显然是错误的:
Process.GetCurrentProcess().MainWindowTitle.Take(4)
因为 MainWindowTitle
是一个 String
,所以这意味着您的输入将是一个 IEnumerable(Of Char)
,所以您只会得到字符串中的前四个字符。这看起来更有希望:
Process.GetCurrentProcess().MainWindowTitle.Split.Take(4)
你真的检查过 Split
returns 你认为它的作用吗?当代码按预期工作时,永远不要假设任何事情。检查。
顺便说一下,Split
是一种方法,而不是 属性。当不提供任何参数时,您不必在方法调用中使用括号,但您这样做是为了 GetCurentProcess
那么为什么不为 Split
呢?不一致总是不好的。决定你要做什么,并在任何情况下都去做。就个人而言,为了清楚起见,无论是否有参数,我总是在方法调用中包含括号。不过,我不会在没有参数的构造函数上使用它们,因为乍看之下它可能与数组创建混淆。
无论如何,正如我所说,如果 Split
returns 正确的输入那么 Take
将提供正确的输出。问题是,您知道如何处理该输出吗?你要它干什么?需要枚举一个 IEnumerable(Of T)
才能有任何用处,具体如何操作取决于您最终想要得到什么。例如,如果您想将这些子字符串重新连接回 String
并在它们之间留有空格,那么您可以调用 String.Join
并将列表作为第二个参数传递。当然,如果你打算这样做,那么你最好接受我的其他建议,即 IndexOf
和 Split
.
我会做:
Dim originalString As String = Process.GetCurrentProcess().MainWindowTitle
Dim splittedString As String() = originalString.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
Dim productName As String = splittedString(0)