如何在 LINQ 查询中将字符串解析为浮点数?

tra*_*req 2 c# linq forms

我正在编写一个摩尔质量计算器,它将显示有关用户传入的化学式的信息,例如元素的原子序数、它们的符号、它们的沸点和熔点等。

信息显示在DataGridView一个DataTable作为DataSource。我还构建了一个名为 Element 的类,不出所料,它代表一个 Element。它只是持有一堆字符串属性来表示元素信息,例如原子序数、沸点等。

我从中提取元素信息的 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);
        }
Run Code Online (Sandbox Code Playgroud)

这按预期工作 - 它按照您的预期对原子质量列进行排序。我为熔点列排序尝试了相同的方法:

        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);
        }
Run Code Online (Sandbox Code Playgroud)

这失败了,并以看似随机的方式订购。我该如何解决这个问题,同时保持在 LINQ 方法的领域?我正在努力提高我在该领域的技能。

AAA*_*ddd 6

您按是否为 a 排序float,而不是按排序

也许你想要这样的东西:

orderby float.TryParse(el.MeltingPoint, out var value) ? value : float.MinValue 
Run Code Online (Sandbox Code Playgroud)

如果它不是浮点数,请将其放在底部


尝试解析

将数字的字符串表示形式转换为其等效的单精度浮点数。返回值指示转换是成功还是失败。