在c#数组中查找最大值

时间:2015-12-15 16:20:09

标签: 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
  Christina Chandler 105
  Greg Hamilton 107
  Pearl Becker 111
  天使福特115
  Wendell Sparks 118

像我说的那样,当我尝试没有数组时,我可以让它从第一个结果中显示100。我也不知道当我找到最大的结果时如何将其链接回学生名称。

3 个答案:

答案 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;然后将其转换为整数。然后返回这些值的最大值。