返回类型为IEnumerable <t>

时间:2015-12-16 12:24:16

标签: c#

我正在为我的网站设计搜索引擎。读取搜索键并返回数据。

我的测试代码:

public string ErrorMessage { get; set; }

private IEnumerable<TopicViewModels> GetTopics(List<TopicViewModels> topics)
{
   foreach (var item in topics)
   {
      yield return item;
   }
}

public async Task<IEnumerable<TopicViewModels>> Search(string key)
{
   try
   {
      using (var db = new MyDbContext()) //EF
      {
         var topics = await db.Topics.Where(x => x.Title.Contains(key)).ToListAsync();
         if (topics != null && topics.Count > 0)
         {
            return await Task.Run(() => GetTopics(topics));
         }
         ErrorMessage = "No topic was found.";
       }
    }
    catch (Exception e)
    {
       ErrorMessage = e.Message;
    }
    return null;
 }

我正在寻找一种解决方案,我可以使用GetTopics方法作为匿名方法。无需创建新方法来获取所有主题,因为不再有其他类/方法重用GetTopics方法。

但我的问题是:匿名方法无法接受yield return。就像:

var topics = await db.Topics.Where(x => x.Title.Contains(key)).ToListAsync();
topics.ForEach(x => 
{
   yield return x;
});

所以,我的问题是:还有其他方法可以做得更好吗?

更新:(基于@EricLippert评论)

public async Task<IEnumerable<TopicViewModels>> Search(string key)
{
   using (var db = new MyDbContext())
   {
      var topics = await db.Topics.Where(x => x.Title.Contains(key)).ToListAsync();
      if (topics != null && topics.Count > 0)
      {
         foreach (var topic in topics)
         {
            yield return topic;
         }
      }
      ErrorMessage = "No topic was found.";
      yield return null;
   }            
}

错误语法消息:

  

&#39; TopicMaster.Search(字符串)&#39;不能成为迭代器块   因为Task<IEnumerable<TopicViewModels>>不是迭代器   界面类型

更新2:

public async Task<IEnumerable<TopicViewModels>> Search(string key)
{
   var topics = await new MyDbContext().Topics.Where(x => x.Title.Contains(key)).ToListAsync();
   return topics != null && topics.Count > 0 ? topics : null;
}

1 个答案:

答案 0 :(得分:3)

这就是埃里克所说的:

if (topics != null && topics.Count > 0)
{
  return topics;
}

具体来说,List<T>实现了IEnumerable<T>,因此您只需返回列表即可。不需要迭代器块或匿名代理,或Task.Runforeach / ForEach