使用“yield”时如何返回空行?

时间:2013-09-12 09:44:37

标签: c# .net

我有以下代码使用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;
}

2 个答案:

答案 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问题我认为改进解决方案更好。