我有以下代码使用yield来构建集合:
public IEnumerable<Comment> GetComments(
IEnumerable<ContentItem> commentContentItems)
{
foreach (var commentContentItem in commentContentItems)
{
var Comment = new Comment
{
CommentCreatedByName = commentContentItem.InitiatorName,
CommentCreatedByID = commentContentItem.CreatedByID,
ContentItemID = commentContentItem.ContentItemID,
CommentDate = commentContentItem.CreatedDate
};
yield return Comment;
}
}
我想开始检查项目是否被删除,如果是,则以不会将已删除的项目添加到集合中的方式生成。
我知道我可以使用linq减少这样的设置:
foreach (var commentContentItem in commentContentItems.Where(x => !x.Deleted))
但为了争论;你会怎样使用yield,比方说situations where yield is more performant?
例如:
if (commentContentItem.Deleted)
{
yield return null;
}
答案 0 :(得分:11)
我是否认为您只是不想在结果中删除已删除的项目?
那么在那种情况下就不要yield return
!
if (!commentContentItem.Deleted)
yield return Comment;
答案 1 :(得分:4)
我建议你在这里使用Select
,它更简单
public IEnumerable<Comment> GetComments(
IEnumerable<ContentItem> commentContentItems)
{
return commentContentItems.Where(x=>!x.IsDeleted).Select(x=>new new Comment
{
CommentCreatedByName = x.InitiatorName,
CommentCreatedByID = x.CreatedByID,
ContentItemID = x.ContentItemID,
CommentDate = x.CreatedDate
});
}
它会工作相同,看起来更干净。它将完成这项工作并返回不包含已删除项目的IEnumerable。
这是一个XY问题我认为改进解决方案更好。