如何从包含列表的类中删除列表元素?

4

我有一个包含ParentDetail列表的Parent类。这个类运行良好,但现在我需要提供一种方法来删除任何ParentDetail对象,其ParentDetail.Text为空字符串。

是否有一种简单的方法可以通过向Parent类添加另一个方法来实现这一点?

public class Parent {
        public IList<ParentDetail> ParentDetails {
            get { return _ParentDetails; }
        }
        private List<ParentDetail> _ParentDetails = new List<ParentDetail>();
        public Parent() {
            this._ParentDetails = new List<ParentDetail>();
        }
    }

    public class ParentDetail {
        public ParentDetail() {
            this.Text = new HtmlText();
        }
        public HtmlText Text { get; set; }
    }

    public class HtmlText {
        public HtmlText() {
            TextWithHtml = String.Empty;
        }
        [AllowHtml]
        public string TextWithHtml { get; set; } 
    }

2
除非有充分的理由允许空节点,否则我建议您在填充列表的代码中输入数据之前对其进行过滤。编写这样的方法会污染您的公共接口,并为用户引入不必要的额外步骤。 - Merlyn Morgan-Graham
2个回答

11
public void RemoveEmptyChildren() {
     _ParentDetail.RemoveAll(
         x => x.Text == null ||
         string.IsNullOrEmpty(x.Text.TextWithHtml));
}

非常感谢。我没想到会有这么简单的解决方案。非常棒的答案。我会标记为已回答。 - UCC

1

你也可以让它更加通用一些:

public void RemoveChildren( Predicate<Child> match )
{
    _parentDetail.RemoveAll (match);
}

然后,您可以像这样使用它:

Parent p = new Parent();
p.RemoveAll (x => x.Text == null || String.IsNullOrEmpty(x.Text.TextWithHtml));

我还会在ParentDetail中添加一个额外的属性:IsEmpty
public class ParentDetail
{
   public HtmlText Text {get; set;}

   public bool IsEmpty  
   {
      return this.Text == null || String.IsNullOrEmpty(this.Text.TextWithHtml);
   }
}

那么,你的代码可以简化成这样:

Parent p = new Parent();
p.RemoveAll (x => x.IsEmpty);

Marc的回答很明确(我喜欢),但如果你想要更多的灵活性,使用一个Func参数会更加灵活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接