c# - 将 IList<T1> 转换为 ILIst<T2>

标签 c# list linq oop casting

尝试这样转换

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 方法

最佳答案

由于 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 查询而无需多次迭代您的集合

关于c# - 将 IList<T1> 转换为 ILIst<T2>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485386/

相关文章:

c# - 是否可以使用 linq 枚举两个 IEnumerables 的所有排列

c# - 如何使用 Linq 检查列表中的所有元素是否为属性返回 true?

c# - 如何获取和安装根 CA 证书

c# - 对 HttpContext.Current.Session 的静态引用是否为所有用户返回相同的 session ?

list - LINQ 查询从 csv 文件的列表中查找元素

LINQ:我们可以从层次结构创建一个平面列表吗

c# - 获取可空类型的类型定义会破坏不可空类型的代码

c# - 有什么方法可以读取/写入对象到.csv

c++ - 如何将列表分成多个 vector ?

arrays - 在 F# 中使用相同的键映射多个元素