返回类型为IEnumerable<;T>;

本文关键字:gt lt 返回类型 IEnumerable | 更新日期: 2023-09-27 18:27:10

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

我的测试代码:

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;
   }            
}

错误语法消息:

"TopicMaster.Search(string)"的正文不能是迭代器块因为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;
}

返回类型为IEnumerable<;T>;

这就是Eric所说的:

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

具体来说,List<T>实现了IEnumerable<T>,所以您可以只返回列表。不需要迭代器块、匿名委托、Task.Runforeach/ForEach