我正在为我的网站设计搜索引擎。读取搜索键并返回数据。
我的测试代码:
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;
}
答案 0 :(得分:3)
这就是埃里克所说的:
if (topics != null && topics.Count > 0)
{
return topics;
}
具体来说,List<T>
实现了IEnumerable<T>
,因此您只需返回列表即可。不需要迭代器块或匿名代理,或Task.Run
或foreach
/ ForEach
。