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 {  get set ; }
    
public   string  Link {  get set ; }
    
public   string  Author {  get set ; }
    
public  DateTime PubDate {  get set ; }
    
public   string  Description {  get set ; } 

    
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多行代码。

转载于:https://www.cnblogs.com/rocklau/archive/2008/04/24/1168925.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值