将IEnumerable<X>转换为IEnumerable<Y>

3
IEnumerable<ContactPerson> results = _contactPersonRepository.GetContactPersons().Where(x => x.UserId == user.UserId);
IEnumerable<ContactPersonViewModel> contactPersons = results...

我该如何做到这一点呢?我有一个 IEnumerable<X>,然后我想将其转换为 IEnumerable<Y>

有什么方法可以做到这一点吗?

谢谢!

5个回答

4

如果你想将项目Y转换为新类型X,请使用Select()方法,如果Y是继承自X的,则请使用Cast()方法,这两个方法都是对于IEnumerable<T>的扩展。

IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Select(p => CreateContactPersonViewModelFrom(p));

如果 ContactPersonViewModel 是 ContactPerson:
IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Cast<ContactPersonViewModel>();

通常创建视图模型需要手动将实体属性映射到视图模型中,就像这样:
IEnumerable<ContactPersonViewModel> contactPersons = 
    results.Select(p => new ContactPersonViewModel {
                       Name = p.Name,
                       Phone = p.Phone
                   });

我建议您查看一些映射框架,比如Automapper。它可以为您完成许多映射工作。使用它后,代码将如下所示:

IEnumerable<ContactPersonViewModel> contactPersons = 
    Mapper.Map<IEnumerable<ContactPersonViewModel>>(results);

1
当然,Enumerable.Select
var contactPersons = results.Select(r => new ContactPersonViewModel(r));

这里假设有一个ContactPersonViewModel构造函数,它需要一个ContactPerson作为参数;如果没有,则需要提供另一种初始化视图模型的方法。

1
尝试进行类型转换。
 IEnumerable<ContactPerson> results = _contactPersonRepository.GetContactPersons().Where(x => x.UserId == user.UserId);

 IEnumerable<ContactPersonViewModel> contactPersons = results.Cast<ContactPersonViewModel>();

0

其中一种方法是使用Select方法:

IEnumerable<ContactPersonViewModel> contactPersons = results.Select(x => new ContactPersonViewModel 
{
   Id = x.Id
   //...
});

0

这可能会有所帮助(您可以使用Select方法):

  IEnumerable<ContactPersonViewModel> contactPersons = 
      results.Select(i=>new ContactPersonViewModel(){/*set your parameters */});

别忘了添加 using System.Linq;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接