2011-03-31 36 views
0

我有迭代列表的代码。如何过滤这个linq查询中的空值?

public static AffiliateList FromDate(string date) 
    { 
     Console.WriteLine("calling affiliates by date for " + date); 
     AffiliateList al; 
     try 
     { 
      al = new AffiliateList(DirectTrackXmlUtility.AffilaitesByDate(date)); 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
     return al; 
    } 

    public override IEnumerator<AffiliateItem> GetEnumerator() 
    { 
     return (from ru in Inner.resourceURL 
       select ru.location 
       into date select FromDate(date) 
       into listForDate from ru2 in listForDate.Inner.resourceURL 
       select AffiliateItem.From(ru2)). 
      GetEnumerator(); 
    } 

问题:如何修改处理FromDate返回null的代码?

注意:我永远都不会想出如何编写这个查询,但是我的嵌套foreach循环为我重新做了更清晰的工作,现在我很感兴趣,看看我能否使它工作...

更新:这是最终的linq查询,以及最初的non-linq方式注释掉。

 return (from ru in Inner.resourceURL 
       select ru.location 
       into date select FromDate(date) 
       into listForDate where listForDate != null from ru2 in listForDate.Inner.resourceURL 
       select AffiliateItem.From(ru2)).GetEnumerator(); 
     //foreach (resourceListResourceURL ru in Inner.resourceURL) 
     //{ 
     // string date = ru.location; 
     // AffiliateList listForDate = FromDate(date); 
     // if (listForDate != null) 
     // { 
     //  foreach (var ru2 in listForDate.Inner.resourceURL) 
     //  { 
     //   yield return AffiliateItem.From(ru2); 
     //  } 
     // } 
     //} 
+1

你能告诉我foreach循环吗?我认为创建一个LINQ查询比从那个...更容易。 – Femaref 2011-03-31 22:15:50

+1

您想如何处理FromDate为空?跳过它?使用默认日期? – 2011-03-31 22:17:08

+3

难道你不能使用'using'代替try/catch吗? – 2011-03-31 22:19:43

回答

0
return Inner.resourceURL.Select(ru => FromDate(ru.location)) 
         .Where(d => d != null) 
         .SelectMany(ru => 
            ru.Inner.resourceURL 
             .Select(ru2 => AffiliateItem.From(ru2))) 

原谅我没有使用查询语法,我只要找到方法链更富于表现力。

还要注意,这是没有任何IDE编码,所以有可能出现错误。

1

如何

int date select (FromDate(date) ?? new AffiliateList()) 

from ru in Inner.resourceURL 
select ru.location into date 
select FromDate(date) into listForDate 
where listForDate != null 
from ru2 in listForDate.Inner.resourceURL 
select AffiliateItem.From(ru2)