Vb.net 如何使用字符串切片从字符串中提取单个数据段,例如R、P、H

Vb.net 如何使用字符串切片从字符串中提取单个数据段,例如R、P、H,vb.net,Vb.net,我们有一个带有单个值的字符串,如23.N.34.H.67等 -既然你的导师建议进行切片,看看他是否想到了使用这种方法。我使用lambda表达式来确定数组的大小,如果您不想像我的另一个示例中那样使用列表 static void Main(string[] args) { FileStream telData; List<int> myNumbers = new List<int>(); telData = new FileStream(@"C:\te

我们有一个带有单个值的字符串,如23.N.34.H.67等
-

既然你的导师建议进行切片,看看他是否想到了使用这种方法。我使用lambda表达式来确定数组的大小,如果您不想像我的另一个示例中那样使用列表

static void Main(string[] args)
{
    FileStream telData;
    List<int> myNumbers = new List<int>();
    telData = new FileStream(@"C:\temp\inputdata.txt", FileMode.Open);
    StreamReader strmRead = new StreamReader(telData);
    string d = "";
    string tempdata;

    while ((tempdata = strmRead.ReadLine()) != null)
    {
        d += tempdata;
    }
    telData.Close();


    Console.WriteLine(AverageParsedValues(d, 'H'));
    Console.WriteLine(AverageParsedValues(d, 'P'));
    Console.WriteLine(AverageParsedValues(d, 'T'));
    Console.ReadLine();

}

static double AverageParsedValues(string data, char match)
{
    int start;
    int end;
    int[] value = new int[data.Where(c => c == match).Count()];

    int index =0;
    int temp;

    for (int i = 0; i < data.Length-1; i++)
    {
        if (data[i] == match)
        {
            start = data.IndexOf(':', i) + 1;
            end = data.IndexOf(':', start);
            if (int.TryParse(data.Substring(start, end - start), out temp))
            {
                value[index] = temp;
                index += 1;
            }
        }
    }
    return value.Average();
}
static void Main(字符串[]args)
{
文件流远程数据;
List myNumbers=新列表();
telData=newfilestream(@“C:\temp\inputdata.txt”,FileMode.Open);
StreamReader strmrread=新的StreamReader(telData);
字符串d=“”;
字符串数据;
而((tempdata=strmrread.ReadLine())!=null)
{
d+=临时数据;
}
telData.Close();
Console.WriteLine(平均解析值(d,'H'));
Console.WriteLine(平均解析值(d,'P'));
WriteLine(平均解析值(d,'T'));
Console.ReadLine();
}
静态双平均ParsedValue(字符串数据、字符匹配)
{
int启动;
内端;
int[]value=newint[data.Where(c=>c==match.Count()];
int指数=0;
内部温度;
对于(int i=0;i

编辑:修改后的方法不再需要数组或列表:

static double AverageParsedValues(string data, char match)
{
    int start;
    int end;
    int value = 0;
    double count = 0; //Double so that we return a double not an integer
    int temp;

    for (int i = 0; i < data.Length-1; i++)
    {
        if (data[i] == match)
        {
            start = data.IndexOf(':', i) + 1; // Find Start of Data
            end = data.IndexOf(':', start); // Find End of Data
            if (int.TryParse(data.Substring(start, end - start), out temp))
            {
                value += temp;
                count += 1;
            }
        }
    }
    if (count != 0) //Check for divide by zero
        return value / count;
    else
        return 0;
}
静态双平均解析值(字符串数据、字符匹配)
{
int启动;
内端;
int值=0;
double count=0;//double,因此我们返回一个double而不是整数
内部温度;
对于(int i=0;i
您可以执行以下操作,从文本文件中读取所有文本(我不确定文本中是否有换行符),然后为每个值提取字符串。之后,您将能够以最适合您的方式解析这些字符串

            string inputString = File.ReadAllText(@"E:\inputdata.txt");
            List<string> D = new List<string>();
            List<string> H = new List<string>();
            List<string> P = new List<string>();
            List<string> T = new List<string>();
            List<string> R = new List<string>();
            while (inputString.Length > 0)
            {
                int index = inputString.IndexOfAny(new char[] { 'D', 'T', 'H', 'P', 'R' },1);
                string subStr = string.Empty;
                if (index >= 0)
                {
                    subStr = inputString.Substring(0, index - 1);
                    inputString = inputString.Substring(index);
                }
                else
                {
                    subStr = inputString;
                    inputString = string.Empty;
                }
                switch (subStr[0])
                {
                    case 'D':
                        D.Add(subStr.Substring(1).Trim(':'));
                        break;

                    case 'T':
                        T.Add(subStr.Substring(1).Trim(':'));
                        break;

                    case 'H':
                        H.Add(subStr.Substring(1).Trim(':'));
                        break;
                    case 'P':
                        P.Add(subStr.Substring(1).Trim(':'));
                        break;
                    case 'R':
                        R.Add(subStr.Substring(1).Trim(':'));
                        break;
                }

            }
string inputString=File.ReadAllText(@“E:\inputdata.txt”);
列表D=新列表();
列表H=新列表();
列表P=新列表();
列表T=新列表();
列表R=新列表();
while(inputString.Length>0)
{
int index=inputString.IndexOfAny(新字符[]{'D','T','H','P','R'},1);
string subStr=string.Empty;
如果(索引>=0)
{
subStr=inputString.Substring(0,索引-1);
inputString=inputString.Substring(索引);
}
其他的
{
subStr=输入字符串;
inputString=string.Empty;
}
开关(subStr[0])
{
案例“D”:
D.添加(子字符串(1).修剪(“:”);
打破
案例“T”:
T.Add(subStr.Substring(1).Trim(':');
打破
案例“H”:
H.Add(subStr.Substring(1).Trim(':');
打破
案例“P”:
P.Add(subStr.Substring(1).Trim(':');
打破
案例“R”:
R.Add(subStr.Substring(1).Trim(':');
打破
}
}

我编辑了你的标题,以便更好地总结你想要的内容。所有数据都消失了,这个问题没有任何意义sense@Nick谢谢,我从来没有用过这种方法,我只用c#进行了大约10个小时的课堂辅导,有人告诉我,我需要创建一个简单的字符串/数组切片程序this@RyanShadesallnightCarter我使用LLAMDA/linq的原因是为数组定尺寸。正如我前面所说的,创建阵列时需要知道阵列的大小,因为重新定尺寸是一项非常昂贵的操作。在本例中,我可能会使用类似于前面示例的列表。我想你可以在方法中把它们加起来,数一数有多少匹配,然后求平均值。我将在稍后提出一个修改过的方法。@RyanShadesallnightCarter因为这对您来说是一次学习经验,请确保您理解该方法的作用。@PinkFloyd这很好,我只是想确保您理解。:)