C# 如何将所有对象从一个IList移动/复制到另一个IList

C# 如何将所有对象从一个IList移动/复制到另一个IList,c#,.net,C#,.net,我正在从事ASP.NETMVC4项目。我有ViewModel,它是: public class SectionModel { public Menu Menu { get; set; } public IList<Document> Documents { get; set;} } 但是我不确定这样做是否正确。如果您的代码应该与其他项目交互操作,但在下面您总是使用列表,我建议使用接口 你必须改变这个 public class SectionModel {

我正在从事ASP.NETMVC4项目。我有
ViewModel
,它是:

public class SectionModel
{
    public Menu Menu { get; set; }
    public IList<Document>  Documents { get; set;}
}

但是我不确定这样做是否正确。

如果您的代码应该与其他项目交互操作,但在下面您总是使用
列表,我建议使用接口

你必须改变这个

 public class SectionModel
{
    public Menu Menu { get; set; }
    public List<Document>  Documents { get; set;}
}

我一直都有一个共同的想法,就是在声明属性时使用接口来声明列表(或其他一些集合类型)。我理解这样做的动机,如果你决定把标准的.NET
列表
类扔给你自己的孩子

我还没有找到合理的理由。你违反了“让我们在任何情况下都把一切抽象出来,即使它们不是特别相关”的成语。(我们不要忘记,POCO上的接口并不特别友好。)

如果我在设计一个API,我可能会使用
IList
,即使一切都在内部使用
列表。事实是,这有点用词不当。我从来没有理由使用IList,因为它就是这样。。。用词不当

正如Julie所说,交换掉该接口,并在其中放入一个合适的类(
List
)。。它不仅是具体的,而且你可以使用它,因为它应该被使用。人们总是喜欢谈论
接口的术语,以防我改变主意
,但这就是糟糕设计的臭味


不要害怕使用一个真实的、具体的类。

如果你考虑使用<代码> AutoPuffer-<代码>,这里的代码是:

首先,确保已安装
AutoMapper
。使用
packagemanager
并键入命令
packageinstallautomapper

var anonymous = new { 
  Menu = unitOfWork.MenuRepository.GetById(Id);, 
  Documents = unitOfWork.DocumentRepository.GetBy(x => x.MenuID ==  menu.MenuID).ToList(); 
};


  var sectionModel = AutoMapper.Mapper.DynamicMap<SectionModel>(anonymous);
var anonymous=new{
Menu=unitOfWork.MenuRepository.GetById(Id);,
Documents=unitOfWork.DocumentRepository.GetBy(x=>x.MenuID==menu.MenuID.ToList();
};
var sectionModel=AutoMapper.Mapper.DynamicMap(匿名);
我为什么建议用这个

第1点:
IList
在这里很好。有人(或你)在设计时放在那里,一切都很好。根据我的说法,更改为
列表
是不必要的。您的
model
对象只是用来放置信息的,而
IList
很好,因为您的
sectionmodel
类不会更改或删除其中的任何条目。因为它只是用于
枚举
很好


第2点:您可以进行手动映射。但是,
AutoMapper
只是保持代码可读性。

您应该尝试
binding
mapping
项目。检查
Automapper
你也可以做一个演员阵容。@Leron:检查我的答案,寻找一个反论点。:)您的文档类型是否为ListIt's
IList
,如您所见。您是否建议将其更改为
List
并仅使用
AddRange
?您应该将其更改为List,以便使用AddRange@JulieShannon:不,这可能有味道。您不应该仅仅为了使用
AddRange
,而将IList更改为List,尤其是当其较大时@Leron:
Automapper
是一个很好的方法。看看。@Leron了解Moo Juice的答案是最好的方法。事实上,有了一些PHP和Java背景,让人觉得C#中的接口使用得更频繁。老实说,我不知道如何选择,我认为人们需要对语言有充分的了解,才能真正了解每种情况的利弊,但这并不能改变接口确实被大量使用的事实。@Moo juice:对不起,我不完全同意。为什么要更改
模型
对象?毕竟,它的唯一目的是表示信息,而IList在这里看起来很适合我。仅为了使用
AddRange
扩展方法,更改为
List
看起来是不必要的。@现在他不必命名。一个公平的观点-但是如果我们沿着这条路线走,那么收集肯定会超越接口级别吗?你是说纯粹因为一个方法而使它成为
List
而不是
IList
,这就是推理。我们在谈论POCO,我希望我能得到一份清单。谢谢你的解释。我以前从未使用过
AutoMapper
。不过看起来很有趣。尽管如此,我还是在寻求更自然的C#方法。使用第三方库似乎有点过分了。
 public class SectionModel
{
    public Menu Menu { get; set; }
    public List<Document>  Documents { get; set;}
}
  model.Documents.AddRange(docs);
var anonymous = new { 
  Menu = unitOfWork.MenuRepository.GetById(Id);, 
  Documents = unitOfWork.DocumentRepository.GetBy(x => x.MenuID ==  menu.MenuID).ToList(); 
};


  var sectionModel = AutoMapper.Mapper.DynamicMap<SectionModel>(anonymous);