Как разобрать строку как число с плавающей точкой в ​​запросе LINQ? - PullRequest
2 голосов
/ 15 февраля 2020

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

Информация отображается в DataGridView, который имеет DataTable в качестве DataSource. Я также создал класс под названием Элемент, который, что неудивительно, представляет Элемент. Он просто содержит набор строковых свойств для представления информации об элементе, таких как номер атома c, точка кипения и т. Д. c.

Файл CSV, из которого я извлек информацию об элементе, имеет некоторую пустоту записи, потому что не все известно о каждом элементе. Я заменил записи словом «неизвестно», что объясняет, почему каждое свойство в классе Element является строкой.

В настоящее время для столбцов, требующих нестрочной сортировки, я использую LINQ для Закажите коллекцию, которая строит DataTable. Например:

        private void SortByAtomicMass()
        {
            var elementsByAtomicMass = (from el in Elements
                                        orderby float.Parse(el.Mass)
                                        select new
                                        {
                                            el.Name,
                                            el.AtomicNumber,
                                            el.Symbol,
                                            el.Mass,
                                            el.CPKHexColor,
                                            el.Electronegativity,
                                            el.State,
                                            el.BondingType,
                                            el.MeltingPoint,
                                            el.BoilingPoint,
                                            el.GroupBlock,
                                            el.YearDiscovered
                                        }).ToList<dynamic>();
            GenerateNewDataTable(elementsByAtomicMass);
        }

Это работает так, как задумано - сортирует столбец массы атома c, как и следовало ожидать. Я попробовал такой же подход для сортировки столбцов с точками плавления:

        private void SortByMeltingPoint()
        {
            var elementsByMeltingPoint = (from el in Elements
                                          orderby float.TryParse(el.MeltingPoint, out _)
                                          select new
                                          {
                                              el.Name,
                                              el.AtomicNumber,
                                              el.Symbol,
                                              el.Mass,
                                              el.CPKHexColor,
                                              el.Electronegativity,
                                              el.State,
                                              el.BondingType,
                                              el.MeltingPoint,
                                              el.BoilingPoint,
                                              el.GroupBlock,
                                              el.YearDiscovered
                                          }).ToList<dynamic>();
            GenerateNewDataTable(elementsByMeltingPoint);
        }

Это терпит неудачу и упорядочивает, казалось бы, случайным образом. Как я могу это исправить, оставаясь в сфере подхода LINQ? Я пытаюсь улучшить свои навыки в этой области.

1 Ответ

6 голосов
/ 15 февраля 2020

Вы заказываете по float, а не по значению .

Может быть, вы хотите что-то вроде этого:

orderby float.TryParse(el.MeltingPoint, out var value) ? value : float.MinValue 

Если это не число с плавающей точкой, поместите его внизу .


TryParse

Преобразует строку представление числа его эквивалентному числу с плавающей точкой одинарной точности. Возвращаемое значение указывает, успешно ли выполнено преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...