我正在编写一个摩尔质量计算器,它将显示有关用户输入的化学式的信息,例如元素的原子序数、元素的符号、沸点和熔点等。
信息显示在 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,就放在底部。
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/