试图将foreach转换为linq等价物

dot*_*oob 1 c# linq

可能重复:
是否可以在不使用foreach的情况下重新创建此语句?

我有2个共享基类的类

DealBookmarkWrapper : BookmarkWrapper
StoreBookmarkWrapper : BookmarkWrapper
Run Code Online (Sandbox Code Playgroud)

我还有以下声明:

// 1 - This works
List<BookmarkWrapper> bm = new List<BookmarkWrapper>();
foreach(var d in deals)
{
    bm.Add(new DealBookmarkWrapper(d));
}

// 2 - This does not work
List<BookmarkWrapper> bm2 = deals.Select(d => new DealBookmarkWrapper(d)).ToList();
Run Code Online (Sandbox Code Playgroud)

1)工作,但2需要演员工作.我不确定我是做错了什么,还是在第二种场景中确实需要演员.

有人对它有所了解吗?

Ani*_*Ani 7

你的问题是双重的:

  • 类型参数的TToList<T>是由编译器推断为DealBookmarkWrapper,所以List<DealBookmarkWrapper>被产生.
  • 由于List<T>不是协变类型,因此从List<DealBookmarkWrapper>到没有表示保留转换List<BookmarkWrapper>.有关为何如此的详细信息,请参阅此问题.

您已经发现在Select投影中添加强制转换是一种解决方法.另一种方式,在C#4 + .NET 4.0(或更高版本)中将明确指定type-argument并依赖于协方差IEnumerable<T>:

deals.Select(d => new DealBookmarkWrapper(d))
     .ToList<BookmarkWrapper>()
Run Code Online (Sandbox Code Playgroud)