C# 计算数组元素子集的最佳方法

C# 计算数组元素子集的最佳方法,c#,arrays,C#,Arrays,在元素以“/”分隔的字符串中,计算数字元素数的最佳方法是什么 例如,在字符串OL/12/15/NR/17/21中,我们有4个数字元素。在数组中可以找到的唯一非数字元素,即alpha元素是OL off梯形图和NR no result 这是我的解决方案,但我怀疑有更好、更高效的算法: int cnt = 0; string sampleString = "OL/12/15/NR/17/21"; string[] sampleArray = sampleString.split('/'); fore

在元素以“/”分隔的字符串中,计算数字元素数的最佳方法是什么

例如,在字符串OL/12/15/NR/17/21中,我们有4个数字元素。在数组中可以找到的唯一非数字元素,即alpha元素是OL off梯形图和NR no result

这是我的解决方案,但我怀疑有更好、更高效的算法:

int cnt = 0;
string sampleString = "OL/12/15/NR/17/21";
string[] sampleArray = sampleString.split('/');

foreach (string element in sampleArray)
    if (element != "OL" && element != "NR")
        cnt++;

以下是LINQ的替代选项:

string[] sampleArray = sampleString.Split(new Char[]{'/'},StringSplitOptions.RemoveEmptyEntries);
int strCount = sampleArray.Count(x=> x!= "OL" && x != "NR");

这可能会更短,但不能说这是有效的,您可以找到一个工作示例来证明这一点:

这里有一个LINQ的替代选项:

string[] sampleArray = sampleString.Split(new Char[]{'/'},StringSplitOptions.RemoveEmptyEntries);
int strCount = sampleArray.Count(x=> x!= "OL" && x != "NR");

这可能会更短,但不能说这是有效的,您可以找到一个工作示例来证明这一点:

我更喜欢像这样的通用方法:

int cnt = 0;
string sampleString = "OL/12/15/NR/17/21";
string[] sampleArray = sampleString.split('/');
int numValue;

foreach (string element in sampleArray)
    if (Int32.TryParse(element , out numValue))
        cnt++;

我更喜欢这样的通用方法:

int cnt = 0;
string sampleString = "OL/12/15/NR/17/21";
string[] sampleArray = sampleString.split('/');
int numValue;

foreach (string element in sampleArray)
    if (Int32.TryParse(element , out numValue))
        cnt++;

您可以使用正则表达式,下面是完整的代码

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(\d+)";
        string input = @"OL/12/15/NR/17/21";

        foreach (Match m in Regex.Matches(input, pattern))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}
我的工作代码的输出 “12”位于索引3处。 “15”位于索引6处。 “17”位于索引12处。 “21”位于索引15处。
下面是同样的演示:

您可以使用正则表达式,下面是完整的代码

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(\d+)";
        string input = @"OL/12/15/NR/17/21";

        foreach (Match m in Regex.Matches(input, pattern))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}
我的工作代码的输出 “12”位于索引3处。 “15”位于索引6处。 “17”位于索引12处。 “21”位于索引15处。
下面是相同的示例:

使用正则表达式匹配数字:

string sampleString = "OL/12/15/NR/17/21";
int count = Regex.Matches(sampleString,@"\b\d+\b").Count;

使用正则表达式匹配数字:

string sampleString = "OL/12/15/NR/17/21";
int count = Regex.Matches(sampleString,@"\b\d+\b").Count;


@鲁弗斯:是的,你是对的,我添加了一个链接来证明你的评论。毫无疑问,这是一个有效的方法,但仍然不是解决你问题的好方法。改用正则表达式。我做了一个快速秒表测试,发现它比正则表达式快得多。@RufusL:是的,你是对的,我添加了一个链接来证明你的评论毫无疑问这是一个有效的方法,但这仍然不是解决问题的好方法。改用正则表达式。我做了一个快速秒表测试,发现它比正则表达式快得多。试试正则表达式这是一个很容易找到的好方法,试试我的答案。没有必要硬编码任何东西试试正则表达式这是一个很容易找到的好方法,试试我的答案。没有必要硬编码任何东西。你的模式也会与字母表中的数字相匹配。e、 g@OL/12/15/NR1234/17/21。在这种情况下,匹配数为5,但应为4@MUT-为什么它的\d+代表数字,您可以在此处检查:它与数字匹配,但\d不等于[0-9]。@MUT-很抱歉,您可以转到我提供的链接并检查它,您可以在visual studio和chck中运行代码…在不检查它的情况下不要放入-1…只是为了获得更多的点您的模式还将使用字母匹配数字。e、 g@OL/12/15/NR1234/17/21。在这种情况下,匹配数为5,但应为4@MUT-为什么它的\d+代表数字,您可以在此处检查:它与数字匹配,但\d不等于[0-9]。@MUT-很抱歉,您可以转到我提供的链接并检查它,您可以在visual studio和chck中运行代码…打赌不要在不检查它的情况下放入-1…只是为了获得更多pointshow来表示数字的\d+,您可以在这里检查它:regex101.com/r/iI1wQ7/3,如果我错了,请纠正我,这个正则表达式不适合字符串中第一个元素是数字的情况。你是对的。但这个答案只是给你一个更好的方法。但是我更新了答案。@MUT-很抱歉,您可以转到我提供的链接并检查它,您可以在visual studio中运行代码并检查…打赌在不检查的情况下不要输入-1…只是为了获得我的程序的更多点…在visual studio中运行我的代码并检查…并让我知道它是否匹配字母数字…为什么它的\d+代表数字,您可以在此处检查:regex101.com/r/iii1wq7/3,如果我错了,请纠正我,这个正则表达式不适合字符串中第一个元素是数字的情况。你是对的。但这个答案只是给你一个更好的方法。但是我更新了答案。@MUT-很抱歉,您可以转到我提供的链接并检查它,您可以在visual studio中运行代码并检查…打赌不要在不检查它的情况下放置-1…只是为了获得我的程序的更多点。.在visual studio中运行我的代码并检查…并让我知道它是否匹配字母数字。。。。