0

我为 AutoCAD 和 CIVIL 3D 创建了一个 .dll 插件。

我正在尝试检索这些序列的第一个元素:

“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-元素在一个-...。)。

我该怎么做?

非常感谢!

4

2 回答 2

1

如果要使用,Take则必须确保为它提供正确的输入。如果你这样做,那么它将提供正确的输出。你真的知道这些输入和输出是什么吗?输入是一个IEnumerable(Of T),输出是另一个IEnumerable(Of T),包含指定数量的项目或原始列表中的所有项目,以较小者为准。

这显然是错误的:

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

因为MainWindowTitleis aString所以这意味着你的输入将是 anIEnumerable(Of Char)所以你只会得到字符串中的前四个字符。这看起来更有希望:

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

你真的检查过它Split会返回你认为的结果吗?当代码按预期工作时,永远不要假设任何事情。查看。

顺便说一句,Split是方法,而不是属性。当不提供参数时,您不必在方法调用上使用括号,但是您这样做是为了GetCurentProcess为什么不这样做Split呢?不一致总是不好的。决定你要做什么,并在每种情况下都这样做。就个人而言,为了清楚起见,无论是否有参数,我总是在方法调用中包含括号。不过,我不会在没有参数的构造函数上使用它们,因为乍一看它可能会与数组创建混淆。

无论如何,正如我所说,如果Split返回正确的输入,那么Take将提供正确的输出。问题是,您知道如何处理该输出吗?你要它干什么?IEnumerable(Of T)需要枚举一个有任何用途的,以及你如何做到这一点取决于你想要最终得到什么。例如,如果您想将这些子字符串重新连接回 a String,它们之间有空格,那么您将调用String.Join并将列表作为第二个参数传递。当然,如果您要这样做,那么您最好使用我的另一个建议,即IndexOfand Split

于 2018-09-14T09:48:04.630 回答
1

我会做:

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

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

Dim productName As String = splittedString(0) 
于 2018-09-14T09:55:14.680 回答