如何用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 并将列表作为第二个参数传递。当然,如果你打算这样做,那么你最好接受我的其他建议,即 IndexOfSplit.

我会做:

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

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

Dim productName As String = splittedString(0)