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

标签 c# linq

我有一个类型类列表。我想根据类(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/

相关文章:

c# - 如何在另一个列表中创建一个列表?

javascript - 如何从 Javascript 调用 URL Action ?

用于代数简化和求解的 C# 库

c# - 按多对多关系分组

c# - LINQ 删除组中具有特定值的项目

c# - 从单个 LINQ 查询中选择多个值

c# - 从 IEnumerable<DateTime> 获取最早的日期

c# - 按页复制文档以在使用 iTextsharp 之间插入空白页

c# - LINQ 查询的异常未在预期位置捕获

c# - Entity Framework 中的条件包含()