Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中获取特定位置的最佳方法_C#_Regex_Winforms_Wmi_Wmi Query - Fatal编程技术网

C# 从字符串中获取特定位置的最佳方法

C# 从字符串中获取特定位置的最佳方法,c#,regex,winforms,wmi,wmi-query,C#,Regex,Winforms,Wmi,Wmi Query,我已经看了很多关于这个问题的不同观点,根据问题的措辞不同,答案也有所不同。看起来您可以使用split或正则表达式来执行此操作 我正在做的是使用WMI返回主板的版本。无论出于何种原因,制造商投入的不仅仅是版本号。在整个字符串中,版本号位于句点分隔字符串的第三个位置。第二个位置的值始终为86A。在本例中,版本实际上是0460.SIX7910J.86A.0460.2012.0327.1627 那么,就我所做的事情而言,哪一个是“最佳实践”?查询表达式中的正则表达式,循环使用split或其他我尚未找到的

我已经看了很多关于这个问题的不同观点,根据问题的措辞不同,答案也有所不同。看起来您可以使用split或正则表达式来执行此操作

我正在做的是使用WMI返回主板的版本。无论出于何种原因,制造商投入的不仅仅是版本号。在整个字符串中,版本号位于句点分隔字符串的第三个位置。第二个位置的值始终为86A。在本例中,版本实际上是0460.SIX7910J.86A.0460.2012.0327.1627

那么,就我所做的事情而言,哪一个是“最佳实践”?查询表达式中的正则表达式,循环使用split或其他我尚未找到的结果

作为参考,这里是我正在使用的C WMI代码。示例代码使用Windows窗体,因为这是WMI代码创建者输出的。我将在WPF项目中使用它,但我不知道这对于问题的本质意味着什么。我想我可以写出所需的代码,但我正试图了解哪种方式是最好的方式

谢谢你能提供的帮助。如果代码块中没有显示所有代码,我会提前道歉。我想我是按照说明来做的,但在代码块的示例显示中,代码块中有一点代码,然后返回到普通文本,然后返回到代码块。希望实际渲染更清晰

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT BIOSVersion FROM Win32_BIOS"); 

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_BIOS instance");
                    Console.WriteLine("-----------------------------------");

                    if(queryObj["BIOSVersion"] == null)
                        Console.WriteLine("BIOSVersion: {0}", queryObj["BIOSVersion"]);
                    else
                    {
                        String[] arrBIOSVersion = (String[])(queryObj["BIOSVersion"]);
                        foreach (String arrValue in arrBIOSVersion)
                        {
                            Console.WriteLine("BIOSVersion: {0}", arrValue);
                        }
                    }
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

如果版本从一开始就一直是第三个,这是最简单的方法

string s = "SIX7910J.86A.0460.2012.0327.1627";

        string[] arr = s.Split('.');

        Console.WriteLine(arr[2]);

希望它是清楚的。

如果版本从一开始就一直是第三个,这是最简单的方法

string s = "SIX7910J.86A.0460.2012.0327.1627";

        string[] arr = s.Split('.');

        Console.WriteLine(arr[2]);

希望它是清楚的。

在我看来,当您有机会仅使用字符串方法实现字符串操作,并且实现并不复杂时,请尝试使用它,不要使用正则表达式。这是因为大多数方法使用低级C++实现,而正则表达式会导致更多开销。您的整个代码大约需要50毫秒,因此我认为没有必要对其进行进一步优化。只需将此添加到循环中:

foreach (String arrValue in arrBIOSVersion)
{
    string[] split = arrValue.Split('.');

    string version;
    if (split.Length > 3)
        version = split[2];
}

在我看来,如果您有机会只使用字符串方法实现字符串操作,并且实现并不复杂,那么就去做吧,不要使用正则表达式。这是因为大多数方法使用低级C++实现,而正则表达式会导致更多开销。您的整个代码大约需要50毫秒,因此我认为没有必要对其进行进一步优化。只需将此添加到循环中:

foreach (String arrValue in arrBIOSVersion)
{
    string[] split = arrValue.Split('.');

    string version;
    if (split.Length > 3)
        version = split[2];
}

第一:使用@Saket的方法,清晰易懂。 为完整起见,这里有一种正则表达式方法:

(?:[^.]+\.){2}\K # match anything not a dot, followed by a dot
                 # two times and throw it away afterwards
([^.]+)          # match anything not a dot

这将为您提供0460,请参见。

首先:使用@Saket的方法,它清晰易懂。 为完整起见,这里有一种正则表达式方法:

(?:[^.]+\.){2}\K # match anything not a dot, followed by a dot
                 # two times and throw it away afterwards
([^.]+)          # match anything not a dot

这将为您提供0460,请参阅。

使用字符串方法IndexOf查找86A。使用子字符串获取字符串。始终在正则表达式之前使用简单的字符串方法。当字符串方法变得复杂时,使用正则表达式。如果有意义的话,使用String方法和Regex组合并没有什么错。与您的实际问题无关,但在测试后显示queryObj[BIOSVersion]是否为空或我是否遗漏了什么?这可能不言而喻,但实际的BIOSVersion取决于制造商。在我的机器上,它是一个以连字符分隔的列表。不使用.Split.'”的唯一原因是,正如一些答案中所建议的,如果您需要一些异常高的性能。我知道这些场景是存在的,但它们并不典型——它们很罕见。即使这样,我也不会三思而后行,除非您加载测试并发现这个精确操作会导致性能问题。因此,除非你需要在几分钟内处理这块大陆上的每一块主板,否则这几乎不可能有什么关系。可能没有必要。你在PowerShell工作?获取WmiObject-Class win32_bios.SmBIOSBIOSVersionUse字符串方法IndexOf以查找86A。使用子字符串获取字符串。始终在正则表达式之前使用简单的字符串方法。当字符串方法变得复杂时,使用正则表达式。如果有意义的话,使用String方法和Regex组合并没有什么错。与您的实际问题无关,但在测试后显示queryObj[BIOSVersion]是否为空或我是否遗漏了什么?这可能不言而喻,但实际的BIOSVersion取决于制造商。在我的机器上,它是一个以连字符分隔的列表。不使用.Split.'”的唯一原因是,正如一些答案中所建议的,如果您需要一些异常高的性能。我知道这些场景是存在的,但它们并不典型——它们很罕见。即使这样,我也不会三思而后行,除非您加载测试并发现这个精确操作会导致性能问题。所以除非你
我们需要在几分钟内处理这块大陆上的每一块主板,这几乎不可能有什么关系。可能没有必要。你在PowerShell工作?获取WmiObject-Class win32_bios.smbiosbiosversion非常有用的链接,立即添加书签。谢谢分享。非常有用的regex链接,即时书签。谢谢分享。谢谢所有回复的人。几乎所有的回复都很棒!它帮助我澄清了很多事情。感谢所有回复的人。几乎所有的回复都很棒!它帮助我澄清了很多事情。