C# Xamarin数组转float问题:Entry实例化处代码崩溃求助
问题排查与解决
咱们先揪出崩溃的核心原因:你的查询返回的是分组后的Price对象数组,但Entry构造函数根本不接受数组类型的参数,而且后面的float.Parse(p)试图把数组直接转成浮点数,这完全是类型不匹配,不崩溃才怪😂
具体问题拆解
singleNameWithOldestPrice这个查询里,你用了.ToArray(),所以foreach循环里的p是Price[](Price对象组成的数组),但new Entry(p)需要的是单个Price实例或者价格数值,类型对不上直接抛出异常。float.Parse(p)这里,你把整个数组丢给Parse方法,它根本不知道怎么把数组转成浮点数,这也是潜在的报错点。
修正方案
第一步:调整查询,直接取每个分组的最早价格实例
把查询里的.ToArray()改成.FirstOrDefault(),这样就能直接拿到每个分组中时间最早的那个Price对象,而不是整个数组:
var singleNameWithOldestPrice = from p in PriceList where p.NAME.Contains(SelectedProduct, StringComparison.OrdinalIgnoreCase) group p by p.NAME into grp select grp.OrderBy(a => a.TIMESTAMP).FirstOrDefault();
第二步:修正foreach循环的逻辑
现在循环变量是单个Price对象了,还要做一些健壮性处理(比如空值判断、安全解析价格):
foreach (var priceItem in singleNameWithOldestPrice) { // 跳过没有数据的分组,避免空引用异常 if (priceItem == null) continue; // 假设你的Price类有一个存储价格的字段/属性,比如叫PriceValue,替换成你实际的字段名 if (!float.TryParse(priceItem.PriceValue.ToString(), out float price)) { // 价格解析失败时,可以选择跳过或者记录日志 continue; } // 根据Entry构造函数的要求传参:如果构造函数要数值就传price,要Price对象就传priceItem source.Add(new Entry(price) { Label = "Name", ValueLabel = price, Color = SKColor.Parse("#f79c00") }); }
额外说明
- 如果你的
Entry构造函数确实需要接收Price对象(而不是数值),那把new Entry(price)改成new Entry(priceItem)就行,但ValueLabel还是得用解析后的价格数值。 - 用
float.TryParse代替float.Parse是为了避免价格字符串格式错误导致的崩溃,让代码更健壮。
内容的提问来源于stack exchange,提问作者user9198450
相关产品推荐
相关产品推荐

