返回类型为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;
}
这就是Eric所说的:
if (topics != null && topics.Count > 0)
{
return topics;
}
具体来说,List<T>
实现了IEnumerable<T>
,所以您可以只返回列表。不需要迭代器块、匿名委托、Task.Run
或foreach
/ForEach
。