我正在编写一个摩尔质量计算器,它将显示有关用户传入的化学式的信息,例如元素的原子序数、它们的符号、它们的沸点和熔点等。
信息显示在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 方法的领域?我正在努力提高我在该领域的技能。
您按是否为 a 排序float,而不是按值排序。
也许你想要这样的东西:
orderby float.TryParse(el.MeltingPoint, out var value) ? value : float.MinValue
Run Code Online (Sandbox Code Playgroud)
如果它不是浮点数,请将其放在底部。
将数字的字符串表示形式转换为其等效的单精度浮点数。返回值指示转换是成功还是失败。