我在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);
}
}
}
这是我到目前为止所拥有的 清单如下
像我说的那样,当我尝试没有数组时,我可以让它从第一个结果中显示100。我也不知道当我找到最大的结果时如何将其链接回学生名称。John Cross 100
Christina Chandler 105
Greg Hamilton 107
Pearl Becker 111
天使福特115
Wendell Sparks 118
答案 0 :(得分: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
答案 1 :(得分: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
分数值。
答案 2 :(得分:0)
如果每个条目的结尾始终是一个空格,后跟学生的分数,则可以使用简单的子字符串:
int max = text.Max(x => Convert.ToInt32(x.Substring(x.LastIndexOf(' '))));
对于每个条目,创建一个从最后一个索引开始的子字符串。 &#39;然后将其转换为整数。然后返回这些值的最大值。