2015-12-15 2 views
-1

Я делаю программу в C#, которая будет принимать список имен и баллов из текстового документа, получить оценку самостоятельно, а затем найти самую высокую оценку. Я могу отделить имя от оценки, когда он только один, но как только я попытаюсь сделать его массивом, я не знаю, что я делаю.найти максимальное значение в массиве C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.IO.File.Exists(@"U:\StudentExamMarks.txt"); 
     string[] text = System.IO.File.ReadAllLines(@"U:\StudentExamMarks.txt"); 

     int a = 0; 
     string[] results = new string[a]; 

     for(int i=0;i<text.Length ; i++)  
     { 
      int x = text[i].LastIndexOf("\t"); 
      int y = text[i].Length; 
      int z = (y - (x + 1)); 
      results[a] = text[i].Substring((x+1), (z)); 
      a++; 

      Console.WriteLine("{0}", results); 
     } 
    } 
} 

Это то, что я до сих пор список выглядит следующим образом

John Cross 100
Кристина Chandler 105
Грег Гамильтон 107
Pearl Becker 111
Angel Форд 115
Wendell Sparks 118

как я сказал, когда я попытался его без массива, я могу заставить его отобразить 100 из первого результата. Я также не знаю, как, когда я нахожу самый большой результат, как связать его со студенческим именем.

+1

Я удалил декларацию пространства имен, поскольку это испортило отступ, и я также удалил много пустых строк. Пожалуйста, сделайте свой код максимально читаемым, когда вы публикуете его. Далее, на самом деле не совсем ясно, в чем проблема ... похоже, что у вас должен быть класс «Student», и вы должны создать новый экземпляр «Student» для каждой строки текста ... –

ответ

1

Чтобы найти самый высокий балл, вы можете использовать Linq с Regex как этого

var lines = new[] { 
    "John Cross 100", 
    "Christina Chandler 105", 
    "Greg Hamilton 107", 
    "Pearl Becker 111" 
}; 

var maxScore = lines.Max(l => int.Parse(Regex.Match(l, @"\b\d+\b").Value)); 

Здесь я предполагаю, что вы прочитали файл правильно в lines и все из них имеют действительное int значение из Гол.

+0

Работает ли это для "Thurston Howell 3rd 123"? @kips, я согласен с комментарием Джона Скита (http://stackoverflow.com/questions/34294230/finding-max-value-in-a-c-sharp-array#comment56330201_34294230) - создайте объекты 'Student'. Я подозреваю, что лучше подойдет вашему проекту. – radarbob

+0

@radarbob обновил регулярное выражение, чтобы обработать их. Создание класса «Студент», безусловно, будет более чистым способом кодирования, но все же вам понадобится некоторая логика для синтаксического анализа каждой строки текста на объект-ученик. Тем не менее, ответ Тима. –

2

Я предлагаю использовать класс для хранения всех свойств, что улучшает читаемость много:

public class StudentExam 
{ 
    public string StudentName { get; set; } 
    public int Mark { get; set; } 
} 

и после читать все строки и, чтобы заполнить List<StudentExam>:

var lines = File.ReadLines(@"U:\StudentExamMarks.txt") 
    .Where(l => !String.IsNullOrWhiteSpace(l)); 
List<StudentExam> studentsMarks = new List<StudentExam>(); 
foreach (string line in lines) 
{ 
    string[] tokens = line.Split('\t'); 
    string markToken = tokens.Last().Trim(); 
    int mark; 
    if (tokens.Length > 1 && int.TryParse(markToken, out mark)) 
    { 
     StudentExam exam = new StudentExam{ 
      Mark = mark, 
      StudentName = String.Join(" ", tokens.Take(tokens.Length - 1)).Trim() 
     }; 
     studentsMarks.Add(exam); 
    } 
} 

Теперь это легко для получения максимальной отметки:

int maxMark = studentsMarks.Max(sm => sm.Mark); // 118 
0

Если в конце каждой записи всегда есть пробел, за которым следует оценка студента, вы можете использовать простую подстроку:

int max = text.Max(x => Convert.ToInt32(x.Substring(x.LastIndexOf(' ')))); 

Для каждой записи, создайте подстроку, которая начинается с последним индексом «», а затем преобразовать его в целое число. Затем верните максимальные значения.

Смежные вопросы