从对象列表中进行分组和过滤c#

时间:2017-07-11 21:06:31

标签: c# linq

我有一个类型列表。我想根据类的一个成员分组并过滤。我的代码如下所示:

public class SP 
{
    public int ID { get; set; } 
    public string Name { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; }
} 

List<sp> splist = new List<sp>();

 ID    Name            StartDate     EndDate
6025  'Bob'          '2010-05-10'    '2015-08-20'
6026  'Jessica'      '2012-01-15'    '2013-04-13'
6028  'Christina'    '2010-05-10'    '2016-11-20'
6029  'Chris'        '2011-03-20'    '2014-08-19'
6030  'James'        '2011-03-20'    '2012-08-28'
6031  'Morris'       '2009-06-12'    '2017-01-20'

我想要GroupBy并根据&#39; StartDate&#39;准​​备一份报告。属性。 StartDate的实际值仅在运行时才会知道。

请用运行时值帮我查看列表组。我想将结果集设为,

在第一次迭代时,

   6025&#39; Bob&#39; &#39; 2010-05-10&#39; &#39; 2015年8月20日&#39;
   6028&#39;克里斯蒂娜&#39; &#39; 2010-05-10&#39; &#39; 2016年11月20日&#39;
第二年6026&#39;杰西卡&#39; &#39; 2012-01-15&#39; &#39; 2013年4月13日&#39;
第三年6029年克里斯&#39; &#39; 2011-03-20&#39; &#39; 2014年8月19日&#39;
       6030&#39;詹姆斯&#39; &#39; 2011-03-20&#39; &#39; 2012-08-28&#39;
并在第四个     6031&#39;莫里斯&#39; &#39; 2009-06-12&#39; &#39; 2017年1月20日&#39;

2 个答案:

答案 0 :(得分:2)

您还没有为您的类指定过滤器,但在您预期的输出中,您似乎只想使用分组而不是过滤(因为所有结果都在输出中,没有过滤任何内容)。

我在SP课程中所做的一项更改是覆盖ToString()方法,因此该课程有一种友好的方式在输出中显示自己:

public class SP
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public override string ToString()
    {
        var formattedName = (Name + " ").PadRight(13, '.');
        return $"{ID}: {formattedName} Started on: {StartDate:d}, Ended on: {EndDate:d}";
    }
}

然后我添加了您提供的示例数据列表:

// Sample data
var newlist = new List<SP>
{
    new SP {ID = 6025, Name = "Bob", StartDate = DateTime.Parse("2010-05-10"),
        EndDate = DateTime.Parse("2015-08-20")},
    new SP {ID = 6026, Name = "Jessica", StartDate = DateTime.Parse("2012-01-15"),
        EndDate = DateTime.Parse("2013-04-13")},
    new SP {ID = 6028, Name = "Christina", StartDate = DateTime.Parse("2010-05-10"),
        EndDate = DateTime.Parse("2016-11-20")},
    new SP {ID = 6029, Name = "Chris", StartDate = DateTime.Parse("2011-03-20"),
        EndDate = DateTime.Parse("2014-08-19")},
    new SP {ID = 6030, Name = "James", StartDate = DateTime.Parse("2011-03-20"),
        EndDate = DateTime.Parse("2012-08-28")},
    new SP {ID = 6031, Name = "Morris", StartDate = DateTime.Parse("2009-06-12"),
        EndDate = DateTime.Parse("2017-01-20")},
};

现在,您可以使用一行StartDate将此列表分组:

// Group on Property 'StartDate'
var groupedList = newlist.GroupBy(a => a.StartDate).ToList();

最后,为了查看每个组的成员,我们可以将每个组转换为List,这将是组中SP个对象的列表。我们还可以引用group.Key,这是我们按(StartDate)分组的属性。因此,显示组可能看起来像:

foreach (var group in groupedList)
{
    var groupMembers = group.ToList();

    Console.WriteLine($"Members who have a Start Date of: {group.Key:d}");
    Console.WriteLine("--------------------------------------------");
    Console.WriteLine($" - {string.Join("\n - ", groupMembers)}");
    Console.WriteLine("\n");
}

<强>输出

enter image description here

现在,如果您想按StartDategroup.Key)对组进行排序,那么您可以添加OrderBy子句:

// GroupBy and OrderBy Property 'StartDate'
var groupedList = newlist.GroupBy(a => a.StartDate).OrderBy(a => a.Key).ToList();

现在您的输出将被排序,最早的开始日期首先显示(如果您希望最新的OrderBy成为第一个,则可以将OrderByDescending更改为StartDate:< / p>

enter image description here

答案 1 :(得分:1)

使用group by并转换为列表很简单:

var newlist = (from ar in db.A group ar by ar.D select ar).ToList();