c# - 如何在 LINQ 查询中将字符串解析为 float ?

标签 c# forms linq

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

信息显示在 DataGridView 中,它有一个 DataTable 作为 DataSource。我还构建了一个名为 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);
        }

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

        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 方法的范围内?我正在努力提高我在该领域的技能。

最佳答案

您是根据它是否是 float 来排序,而不是根据

也许你想要这样的东西:

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

如果不是float,就放在底部


TryParse

Converts the string representation of a number to its single-precision floating-point number equivalent. A return value indicates whether the conversion succeeded or failed.

关于c# - 如何在 LINQ 查询中将字符串解析为 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60234702/

相关文章:

c# - 从 mysql 数据库中的 EdmGem.exe 生成实体类(ssdl、csdl、msl 等)时出错

c# - 使用 LINQ 查询嵌套类型

c# - 内部元素数量不变的 LINQ.SelectMany 的替代品

c# - 我该如何解决 "The query results cannot be enumerated more than once"?

c# - 如何在 Dapper 中为多映射支持命名列?

c# - 统一如何使用单个操纵杆控制相机 View ?

c# - 通用 DbDataReader 到 List<T> 的映射

javascript - 带有向上/向下箭头的单行选择框,类似于多行选择框

php - 通过 AJAX 提交表单不起作用

javascript - angularjs中嵌套表单的验证