2

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

4

2 回答 2

1

既然您的导师建议切片,请查看使用该String.SubString方法是否是他的想法。我正在使用 lambda 表达式来确定数组的大小,如果您不想像在我的其他示例中那样使用 List 的话。

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 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;
}
于 2012-11-21T19:05:55.927 回答
0

您可以执行以下操作,从文本文件中读取所有文本(我不确定文本中是否有 newLines),然后为每个值提取字符串。之后,您将能够以最适合您的方式解析这些字符串。

            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;
                }

            }
于 2012-11-21T19:15:09.247 回答