gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:35 24 4
gpt4 key购买 nike

我有一个类型类列表。我想根据类(class)成员之一进行分组和过滤。我的代码如下所示:

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 并准备一个基于“StartDate”属性的报告。StartDate 的实际值仅在运行时才知道。

请帮助我列出具有运行时值的分组依据。我想要结果集,

在第一次迭代时,

6025 '鲍勃' '2010-05-10' '2015-08-20'
6028 '克里斯蒂娜' '2010-05-10' '2016-11-20'
第二
6026 '杰西卡' '2012-01-15' '2013-04-13'
第三个
6029 '克里斯' '2011-03-20' '2014-08-19'
6030 '詹姆斯' '2011-03-20' '2012-08-28'
在第四个
6031 '莫里斯' '2009-06-12' '2017-01-20'

最佳答案

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

我在您的 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


现在,如果您想按 StartDate 对组进行排序(这是 group.Key ),然后你可以添加一个 OrderBy子句:

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

现在您的输出将被排序,最早的开始日期出现在最前面(如果您希望最近的 OrderBy 排在最前面,您可以将 OrderByDescending 更改为 StartDate):

enter image description here

关于c# - 从对象列表中分组和过滤 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45044459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com