C# 如何在C3.5中将列表转换为列表

C# 如何在C3.5中将列表转换为列表,c#,C#,代码示例: public Interface IArticle { int cid{get;set;} string Name{get;set;} string Content{get;set;} ... } public Class Article:IArticle { public int cid{get;set;} public string Name{get;set;} public string Content{get;set;}

代码示例:

public Interface IArticle
{
    int cid{get;set;}
    string Name{get;set;}
    string Content{get;set;}
    ...
}
public Class Article:IArticle
{
   public int cid{get;set;}
   public string Name{get;set;}
   public string Content{get;set;}
   public string Extension{get;set;}
    ...
}

/*
ArticleBiz.GetArticles(int cid) is select some items from database,return type:List<Article>
*/
List<IArticle> articleList=ArticleBiz.GetArticles(2).FindAll(p=>p.cid==cid)
例外情况:

Error   1   Cannot implicitly convert type 
    'System.Collections.Generic.List<Zm.Models.Article>'
to
    'System.Collections.Generic.IList<Zm.Models.IArticle>'.
An explicit conversion exists (are you missing a cast?)

问题:我不想在GetArticles中将返回类型更改为List。。方法如何更改代码以成功地将列表转换为列表?

希望,选择可以帮助您

List<IArticle> articleList = ArticleBiz.GetArticles(2).FindAll(p => p.cid == cid)
                                       .Select(x => x as IArticle).ToList()

希望,选择可以帮助你

List<IArticle> articleList = ArticleBiz.GetArticles(2).FindAll(p => p.cid == cid)
                                       .Select(x => x as IArticle).ToList()
您可以使用LINQ:

List<IArticle> articleList = ArticleBiz
    .GetArticles(2)
    .Where(p => p.cid == cid)
    .Cast<IArticle>()
    .ToList();
您可以使用LINQ:

List<IArticle> articleList = ArticleBiz
    .GetArticles(2)
    .Where(p => p.cid == cid)
    .Cast<IArticle>()
    .ToList();
怎么样

List<IArticle> articleList = ArticleBiz.GetArticles(2).Where(p => p.cid == cid) 
                                       .Select(x => (IArticle)x).ToList();
怎么样

List<IArticle> articleList = ArticleBiz.GetArticles(2).Where(p => p.cid == cid) 
                                       .Select(x => (IArticle)x).ToList();

您可以编写自己的隐式演员阵容

public static implicit operator IArticle(Article article)
{
    return article;
}
另一种解决方案是编写显式强制转换运算符

///No need for an explicit cast though.
public static explicit operator IArticle(Article article)
{
    return (IArticle)article;
}

但是,您能告诉我为什么要从数据库而不是IArticle对象返回文章吗?

您可以编写自己的隐式cast

public static implicit operator IArticle(Article article)
{
    return article;
}
另一种解决方案是编写显式强制转换运算符

///No need for an explicit cast though.
public static explicit operator IArticle(Article article)
{
    return (IArticle)article;
}
但是,您能告诉我为什么要从数据库而不是IArticle对象返回文章吗?

以下是我的方法:

IList<IArticle> articles = new List<Article>().Cast<IArticle>().ToList();
我的做法如下:

IList<IArticle> articles = new List<Article>().Cast<IArticle>().ToList();

将列表指定给列表不起作用的原因是,您可以执行以下操作:

class CrazyArticle : IArticle { ... }

List<Article> articles = ...
List<IArticle> iarticles = articles; // this is not actually legal

iarticles.Add(new CrazyArticle());
// now either things should crash because we tried to add CrazyArticle to a List<Article>,
// or we have violated type safety because the List<Article> has a CrazyArticle in it!
这里至少有两个选项:

1您可以使用LINQ Cast运算符构建IArticle类型的新列表:

var iarticles = articles.Cast<IArticle>().ToList();
2您可以更改为返回IEnumerable:

// this is legal because IEnumerable<T> is declared as IEnumerable<out T>
IEnumerable<IArticle> iarticles = articles;

将列表指定给列表不起作用的原因是,您可以执行以下操作:

class CrazyArticle : IArticle { ... }

List<Article> articles = ...
List<IArticle> iarticles = articles; // this is not actually legal

iarticles.Add(new CrazyArticle());
// now either things should crash because we tried to add CrazyArticle to a List<Article>,
// or we have violated type safety because the List<Article> has a CrazyArticle in it!
这里至少有两个选项:

1您可以使用LINQ Cast运算符构建IArticle类型的新列表:

var iarticles = articles.Cast<IArticle>().ToList();
2您可以更改为返回IEnumerable:

// this is legal because IEnumerable<T> is declared as IEnumerable<out T>
IEnumerable<IArticle> iarticles = articles;