• linq to xml 控制投影的类型以解决无法返回匿名类型


    在做Rss输出的时候,想把经常用到的linq放到一个方法内

    var feedtop = (from feed in rssFeeds[0].Descendants("item")
                         select 
    new
                         
    {
                             Title 
    = feed.Element("title").Value,
                             Link 
    = feed.Element("link").Value,
                             Author 
    = feed.Element("author").Value,
                             PubDate 
    = DateTime.Parse(feed.Element("pubDate").Value),
                             Description 
    = feed.Element("description").Value
                         }
    ).Take(count);
    1.  问题:匿名类型的对象无法传递到方法体外

    问题出现了,开始想找到返回匿名类型的方法 想到利用C#的类型推导(这里有 07年Dah的一篇文章细说 [C# 3.0] 传递匿名类型对象的问题),来返回匿名类型,可是 在方法声明的时候必须指明方法返回值的类型。

    这让我犯难了,没办法搬出终极武器Msdn。

    这里引用一下Msdn的话

    匿名类型具有方法范围。若要向方法边界外部传递一个匿名类型或一个包含匿名类型的集合,必须首先将匿名类型强制转换为对象。但是,这会使匿名类型的强类型化无效。如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。

      2.   解决方法投影匿名类型 

    开始改造我们最初的代码,

    首先要提炼出代替匿名类型的实体类

    public class Rss
    {
        
    public string Title { getset; }
        
    public string Link { getset; }
        
    public string Author { getset; }
        
    public DateTime PubDate { getset; }
        
    public string Description { getset; } 

        
    public Rss(string title, string link, string author, DateTime pubDate, string description)
        {
            Title 
    = title;
            Link 
    = link;
            Author 
    = author;
            PubDate 
    = pubDate;
            Description 
    = description;
        } 

     

    接着很简单替换掉new{} 并构造存放linq的方法

    private IEnumerable<Rss> XElementToRss(IEnumerable<XElement> rssitem, int top)
    {
        
    return (from feed in rssitem
                select 
    new Rss(
                     feed.Element(
    "title").Value,
                     feed.Element(
    "link").Value,
                     feed.Element(
    "author").Value,
                     DateTime.Parse(feed.Element(
    "pubDate").Value),
                     feed.Element(
    "description").Value
                )).Take(top);

     

    在外围就可以进行调用了

    XDocument rssfeed = XDocument.Load(path); 

    var feeddb 
    = XElementToRss(rssfeed.Descendants("item"),20); 

     

    Ps:在做Rss的程序开始用的RssToolkit.dll 然后 toDataTable(), 因为要把多个源合并到一起进行处理,所以效率极其低下。后来突然想起自己为什么不用linq 然后把代码改造成了linq的 呵呵节省50多行代码。

  • 相关阅读:
    Hexo博客系列(二)-在多台机器上利用Hexo发布博客
    Hexo博客系列(一)-Windows系统配置Hexo v3.x个人博客环境
    [原创]VMware Workstation 14.1.3 Pro安装CentOS_7.6.1810
    [原创]前后端交互的方式整理
    [转载]白素贞的身世之谜
    [原创]存储过程里面的递归
    [原创]SpringBoot上传图片踩的坑
    [原创]markdown语法学习(commonmark)
    使用IntelliJ IDEA 前最好修改的配置
    软件开发资源下载
  • 原文地址:https://www.cnblogs.com/rocklau/p/1168925.html
Copyright © 2020-2023  润新知