【问题标题】:Casting IList<T1> to ILIst<T2>将 IList<T1> 转换为 ILIst<T2>
【发布时间】:2018-11-02 06:24:36
【问题描述】:

尝试像这样投射

Products1 = (IList<ProductInfo>)basicProfile.Products2.Select(ToProductInfo)

Products1 是一个

public IList<ProductInfo> Products { get; set; }

Product2 是一个

public IList<Product> Products { get; }

这是我对 Product2 的每个元素应用的方法

internal static ProductInfo ToProductInfo(Product product)
    {
        if (product == null)
        {
            return null;
        }

        return new ProductInfo
        {
            Id = product.Id,
            EffectiveTimestamp = product.EffectiveTimestamp,
            ExpiryTimestamp = product.ExpiryTimestamp
        };
    }

Product 和 ProductInfo 结构相同,几乎完全相同

我发现了这个

System.InvalidCastException : Unable to cast object of type 
'SelectArrayIterator`2[Domain.Product,WebApi.Contracts.ProductInfo]' to type 
'System.Collections.Generic.IList`1[WebApi.Contracts.ProductInfo]'.

而且它甚至没有进入 ToProductInfo 方法

【问题讨论】:

  • Simpy 调用 ToList 而不是强制转换,因为 Select 将返回 IEnumerable&lt;T&gt;,而不是 List&lt;T&gt;

标签: c# list linq oop casting


【解决方案1】:

由于 linq 的工作方式(延迟执行)Select,创建一个 IEnumerable

你想要达到的可以通过添加一个ToList()来完成

Products1 = basicProfile.Products2.Select(ToProductInfo).ToList()

或根据您的用例,将 Products1 定义为

public IEnumerable<ProductInfo> Products { get; set; }

欲了解更多信息,请访问此页面 https://msdn.microsoft.com/en-us/library/bb308959.aspx 和延迟查询评估部分

这允许您链接 linq 查询而无需多次迭代您的集合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多