You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将API获取的List转换为ObservableCollection用于图表时遇类型转换错误

解决List转ObservableCollection的类型不匹配问题

嘿,这个问题太常见了——你遇到的核心问题是类型不兼容:CoinHistoryModel和ChartDataModel是两个完全独立的类,C#没办法自动把一个类型的集合直接转换成另一个类型的集合,所以编译器才会抛出那个转换错误。

为什么你的方法1会报错?

你写的代码:

ObservableCollection<ChartDataModel> test = new ObservableCollection<ChartDataModel>(_CoinHistoryGraph as List<CoinMarketCap.SHARED.Models.CoinHistoryModel>);

这里ObservableCollection<ChartDataModel>的构造函数只接受IEnumerable<ChartDataModel>类型的参数,但你传入的是List<CoinHistoryModel>,两者类型完全不匹配,自然无法转换。

正确的解决方案:手动映射模型

你需要把每个CoinHistoryModel实例逐个转换成ChartDataModel实例,再把转换后的集合传给ObservableCollection的构造函数。最直接的方式是用LINQ的Select方法:

// 先把每个CoinHistoryModel映射成ChartDataModel
var mappedChartData = _CoinHistoryGraph.Select(historyModel => new ChartDataModel
{
    // 这里根据你的实际属性对应赋值,示例如下
    Timestamp = historyModel.Timestamp,
    Price = historyModel.Price,
    Volume = historyModel.Volume,
    // 其他需要的属性都要一一对应
}).ToList();

// 再转换成ObservableCollection
ObservableCollection<ChartDataModel> test = new ObservableCollection<ChartDataModel>(mappedChartData);

额外优化建议

  • 如果你的模型属性很多,可以考虑用AutoMapper这类映射库来简化代码,只需要配置一次映射规则,后续就能自动转换。
  • 记得加null检查,避免_CoinHistoryGraph为空时抛出异常:
    if (_CoinHistoryGraph == null)
    {
        test = new ObservableCollection<ChartDataModel>(); // 初始化空集合
        return;
    }
    
  • 如果ChartDataModel和CoinHistoryModel的结构完全一致,也可以考虑让ChartDataModel继承自CoinHistoryModel(但不推荐,因为数据模型和视图模型通常应该解耦),这种情况下可以用Cast方法:
    // 仅当ChartDataModel : CoinHistoryModel时有效
    var test = new ObservableCollection<ChartDataModel>(_CoinHistoryGraph.Cast<ChartDataModel>());
    

内容的提问来源于stack exchange,提问作者Achiel Volckaert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:39:38