我有一个类型列表。我想根据类的一个成员分组并过滤。我的代码如下所示:
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;
答案 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");
}
<强>输出强>
现在,如果您想按StartDate
(group.Key
)对组进行排序,那么您可以添加OrderBy
子句:
// GroupBy and OrderBy Property 'StartDate'
var groupedList = newlist.GroupBy(a => a.StartDate).OrderBy(a => a.Key).ToList();
现在您的输出将被排序,最早的开始日期首先显示(如果您希望最新的OrderBy
成为第一个,则可以将OrderByDescending
更改为StartDate
:< / p>
答案 1 :(得分:1)
使用group by并转换为列表很简单:
var newlist = (from ar in db.A group ar by ar.D select ar).ToList();