如何根据多个条件删除列表中的多个项目

时间:2018-01-04 16:52:36

标签: c# linq

我有List这些对象:

public class DutyAssignmentEntry
{
    private string _Date;
    private string _Week;
    private int _Template;
    private AssignmentMode _Mode;
    private List<Assignment> _Assignments;

    [XmlAttribute]
    public string Date
    {
        get => _Date; set => _Date = value;
    }

    [XmlAttribute]
    public string Week
    {
        get => _Week; set => _Week = value;
    }

    [XmlAttribute]
    public int Template
    {
        get => _Template; set => _Template = value;
    }

    [XmlAttribute]
    public AssignmentMode Mode
    {
        get => _Mode; set => _Mode = value;
    }

    [XmlElement]
    public List<Assignment> Assignments
    {
        get => _Assignments; set => _Assignments = value;
    }

    [XmlIgnore]
    public string Key
    {
        get => _Template + "_" + _Date;
    }

    public DutyAssignmentEntry()
    {
        _Date = "";
        _Week = "";
        _Template = 0;
        _Mode = AssignmentMode.Weekly;
        _Assignments = new List<Assignment>();
    }

    public DateTime ToDate()
    {
        int iYear = Convert.ToInt32(Date.Substring(1, 4));
        int iMonth = Convert.ToInt32(Date.Substring(5, 2));
        int iDate = Convert.ToInt32(Date.Substring(7, 2));

        return new DateTime(iYear, iMonth, iDate);
    }
}

如您所见,我实施了ToDate公共方法。我想创建另一个在两个日期传递的方法(没有时间戳),我想从列表中删除所有在规定日期范围内或等于规定日期范围的项目。

此外,我有一个Template属性,此值也必须匹配。

现在,我了解如何浏览列表并通过测试ToDate值和Template值逐个检查每个enty。但我可以更优雅地做到这一点吗?

所以我有:

_DutyAssignments = new List<DutyAssignmentEntry>();

一种新方法:

public void DeleteDutyHistoryAssignments(DateTime datStart, DateTime datEnd, long lTemplate)
{
    // Fancy way to remove all the items in the list where
    // item.ToDate() >= datStart.Date and
    // item.ToDate() <= datEnd.Date and
    // item.Template = lTemplate
}

1 个答案:

答案 0 :(得分:2)

您可以使用List<T>方法RemoveAll

_DutyAssignment.RemoveAll(x =>
  x.ToDate() >= datStart.Date &&
  x.ToDate() <= datEnd.Date &&
  x.Template == lTemplate
);