Мне нужно взять число из каждой строки текстового файла и найти среднее значение. Я использую потоковый ридер, чтобы взять номер из текстового файла, я не знаю, куда идти дальше. Вот что я сделал до сих пор
using (StreamReader sr = new StreamReader("pupilSkiTimes.txt"))
{
string line = "";
while ((line = sr.ReadLine()) != null)
{
string[] components = line.Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
skiTime.Add(components[7]);
}
sr.Close();
}
Как мне заставить это читать из каждой строки текстового файла, и как только это будет сделано, как мне получить среднее значение.
Если вам нужно знать, данные, которые я пытаюсь прочитать, удваиваются, например, "23.43"
В идеале любой, кто отвечает на вопрос, должен иметь возможность скопировать ваш код, вставить его в текстовый редактор, скомпилировать, запустить и наблюдать за проблемой. И, к сожалению, с вашим постом это невозможно.
Здравствуйте @ShadySpiritomb, можете ли вы показать нам структуру строки вашего текстового файла?
В текстовом файле есть строки с разными данными, каждая из которых разделена знаком «~». Мне нужна только одна часть каждой строки, для чего предназначены компоненты[7].
Например, 0~0~0~0~0~0~0~22.65~0~0~0
является допустимой строкой?
Вот как я это сделаю, как вы упомянули в комментариях components[7]
, это двойные данные, которые вы читаете из файла.
Нам нужно разобрать его на удвоение, суммировать и разделить на время подсчета, которое мы можем разобрать число в файле. Если число не анализируется и вы хотите получить общее среднее значение всех строк, переместите счетчик из оператора if.
using (StreamReader sr = new StreamReader("pupilSkiTimes.txt"))
{
string line;
double sum = 0;
int count = 0;
while ((line = sr.ReadLine()) != null)
{
string[] components = line.Split("~".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries);
if (double.TryParse(components[7], out var result))
{
count++;
sum += result;
}
}
sr.Close();
var average = sum / count;
Console.WriteLine(average);
}
Просто суммируйте, а затем разделите на число, список не нужен (он не вычисляет никаких других показателей).
Полностью согласен, я просто жду ответа OP и обновлю свой ответ.
что вам нужно, чтобы я ответил, извините, я ужасен в С# и действительно не понимаю, что будет делать список
Нет проблем, успокойтесь, все мы когда-то начинали, если у вас есть еще вопросы, просто задавайте, и мы стараемся изо всех сил.
Это говорит мне, что ссылочные типы с нулевым значением недоступны в С# 7.3, есть ли версия этого, которая работает в версии 7.3?
Вы можете удалить строку вопросительного знака? line или обновите свой язык C Sharp до версии 8.0. я обновил свой ответ
Спасибо, просто интересно, как после этого превратить двойное значение в строку?
По какой-то причине он отображается как System.Collections.Generic.List`1[System.Double], что это значит, как мне это исправить
Именно поэтому я не даю вам произвольный ответ. Что именно вы сделали, чтобы это работало раньше. Или попытаться сделать больше.
я только что попытался изменить txt метки на skiTime
среднийSkiTimeLBL.Text = skiTime.ToString();
я сейчас в отъезде посмотрю когда вернусь
Я исправил проблему, я пытался сделать метку = skiTime, когда я должен был использовать среднее значение.
Круто рад это узнать
Я думаю, что удобный метод для такой ситуации полезен, надеюсь, вы его используете, я использую аналогичный this в своих кодах.
Я проезжаю FilePath, разделитель и значение индекса
static double getAvgAtIndex(string fPath, char seperator, int index)
{
double sum = 0;
int counter = 0;
using (StreamReader sr = new StreamReader(fPath))
{
string line = "";
while ((line = sr.ReadLine()) != null)
{
double rawData = 0;
string[] lineData = line.Split(seperator, StringSplitOptions.RemoveEmptyEntries);
double.TryParse(lineData[index], out rawData);
sum += rawData;
counter++;
}
sr.Close();
}
return sum / counter;
}
Использование этого,
static void Main(string[] args)
{
Console.WriteLine("The Avg is: {0}", getAvgAtIndex(@"..\myTextFile.txt", '~' ,1));
// The Avg is: 34.688
}
Вот как использовать LINQ, чтобы немного очистить код
static class Program
{
static void Main(string[] args)
{
var data = File.ReadAllLines("pupilSkiTimes.txt")
.Select((line)=> line.Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));
List<double> skiTime = new List<double>();
foreach (var parts in data)
{
if (double.TryParse(parts[7], out double x))
{
skiTime.Add(x);
}
}
double average = skiTime.Average();
}
}
Не могли бы вы предоставить пример файла (с желаемым результатом), пожалуйста?