我为AutoCAD和民用3D创建了一个AutoCAD插件。
我试图检索这些序列的第一个元素:
"Autodesk AutoCAD 2019年-绘图1“我只想获得"Autodesk AutoCAD 2019”(我想要前3个元素)和"Autodesk民用3D 2019年-绘图1“,我只想获得"Autodesk民事3D 2019”。(我要前四个元素)
我使用Process.GetCurrentProcess().MainWindowTitle获取这些序列,它正在检索我目前正在使用的应用程序的窗口标题。
但是,有时我使用AutoCAD,其他我使用民用3D,我想以字符串的形式检索他们的应用程序名,显示在消息框中,告诉我现在使用的是哪个应用程序。
我试过:
Process.GetCurrentProcess().MainWindowTitle.Substring(0, 22)但是当我在autocad的开头或关闭时显示消息框时,这个选项是不可靠的。只有当我在开始和关闭之间显示消息框时,它才能工作。
我想我应该试试:
Process.GetCurrentProcess().MainWindowTitle.Split.Take(4)或
Process.GetCurrentProcess().MainWindowTitle.Take(4)但是,尽管我已经试图理解它,但我似乎无法让它工作(https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/return-or-skip-elements-in-a-...)。
我该怎么做?
非常感谢!
发布于 2018-09-14 09:55:14
我会这样做:
Dim originalString As String = Process.GetCurrentProcess().MainWindowTitle
Dim splittedString As String() = originalString.Split("-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
Dim productName As String = splittedString(0) 发布于 2018-09-14 09:48:04
如果要使用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。
https://stackoverflow.com/questions/52328986
复制相似问题