Noah41 Ответов: 1

C# - как мне получить максимальное значение из списка, а затем получить элементы этой строки


Во-первых, Всем привет. Я работаю над приложением FormsApp. Мой вопрос заключается в том, что у меня есть linq-код, который читает файл, создает мне список объектов из этого файла (на основе созданных мной переменных). Мой класс переменных выглядит следующим образом:

class Atom
    {
        public string atom_keyword;
        public int atom_no;
        public string atom_name;
        public string amino_name;
        public char chain;
        public int amino_no;
        public float x_coordinate;
        public float y_coordinate;
        public float z_coordinate;
        public float ratio;
        public float temperature;
        public char sec_atom;
    }


И мой файл выглядит так:

ATOM      1  N   MET A   1     -13.878  31.694  -3.970  1.00 52.63           N  
ATOM      2  CA  MET A   1     -13.202  30.367  -3.923  1.00 53.98           C  
ATOM      3  C   MET A   1     -12.645  30.015  -5.292  1.00 54.54           C  
ATOM      4  O   MET A   1     -11.628  29.330  -5.413  1.00 54.54           O  
ATOM      5  CB  MET A   1     -14.175  29.281  -3.472  1.00 55.49           C  
ATOM      6  CG  MET A   1     -13.527  28.198  -2.635  1.00 57.84           C  
ATOM      7  SD  MET A   1     -12.733  28.897  -1.159  1.00 62.51           S  


Я разбиваю эти столбцы и помещаю их в массив, а затем в свой список. Мой главный выглядит так.

// theese lines works under a button1_Click..
string filePath = @"somePath";
string stringToSearch = @"ATOM";
List<Atom> Atoms = File.ReadAllLines(filePath)       // Read all the lines
    .Where(line => line.StartsWith(stringToSearch))  // Filter (because file has some other things besides ATOM parts..)
    .Select(line =>
    {
        // Split the line on the space character into an array 
        var strArray = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

        // Return a new Atom for each line based on the array contents
        return strArray.Length < 12  // Ensure we have at least 12 elements in the array
            ? null                   // If we don't have 12, return 'null'
            : new Atom               // Otherwise return a new atom from the array
            {
                atom_keyword = strArray[0],
                atom_no = int.Parse(strArray[1]),
                atom_name = strArray[2],
                amino_name = strArray[3],
                chain = char.Parse(strArray[4]),
                amino_no = int.Parse(strArray[5]),
                x_coordinate = float.Parse(strArray[6]),
                y_coordinate = float.Parse(strArray[7]),
                z_coordinate = float.Parse(strArray[8]),
                ratio = float.Parse(strArray[9]),
                temperature = float.Parse(strArray[10]),
                sec_atom = char.Parse(strArray[11])
            };
        

    })
    .ToList(); //add them to the list


Мой вопрос таков: Как мне получить максимальное значение переменной (например, максимальное значение x_coordinate), а затем работать с этой строкой. Например, какая строка имеет максимальное значение x_coordinate и каково имя атома этой строки?

Что я уже пробовал:

Я уже пробовал это сделать
float maxX = Atoms.Max(atom => atom.x_coordinate);
label1.Text = Convert.ToString(maxX); //I'm printing the max value of x_coordinate to a label


Эта часть работает просто отлично. Но я хочу получить информацию о линии, где maxX переменная есть. Я имею в виду, какая линия имеет maxX- а в чем дело? atom_name из этой линии или что там еще amino_name этой линии и т. д.. Затем я напечатаю необходимую информацию на этикетке..

Есть ли способ или способ получить эту информацию? Я ищу, но пока не могу найти решение..

1 Ответов

Рейтинг:
5

phil.o

Вы можете сортировать по убыванию и возвращать первое значение.

Atom atom = Atoms.OrderByDescending(a => a.x_coordinate).FirstOrDefault();
label1.Text = atom.x_coordinate.ToString();


Noah41

Да, это возвращает максимальное значение x_coordinate. Есть ли способ узнать, какая это линия? Или каково атомное имя этой строки?

phil.o

У вас есть atom переменная, содержащая все данные этой конкретной "строки".

Noah41

Огромное спасибо. Это именно то, что я искал все это время. Наверное, мне не хватает элементарных знаний...

phil.o

Всегда пожалуйста!

Maciej Los

5ed!