有没有更好的方法来设置linq中项目列表的公共属性

时间:2013-05-15 20:51:17

标签: c# linq

我有以下课程:

public class Vehicle
{
    public string Make { get; set; }
    public DateTime DateManufactured { get; set; }
}

然后我列出了一系列车辆:

        var dateTime1 = DateTime.Now.AddDays(-7);
        var dateTime2 = DateTime.Now.AddDays(-8);
        var dateTime3 = DateTime.Now.AddDays(-9);

        var vehicles = new List<Vehicle>
            {
                new Vehicle {Make = "Ferrari", DateManufactured = dateTime1},
                new Vehicle {Make = "Mazda", DateManufactured = dateTime2},
                new Vehicle {Make = "Dodge", DateManufactured = dateTime3},
                new Vehicle {Make = "Holden", DateManufactured = dateTime1},
                new Vehicle {Make = "Chrysler", DateManufactured = dateTime2},
                new Vehicle {Make = "Mazda", DateManufactured = dateTime3},
            };

接下来,我试图获得DatesManufactured列表以及每个日期在该日制造的车辆。

所以我去了:

var vehiclesGroupedByDate = vechicles.GroupBy(x => x.DateManufactured)
                .Select(x => new
                    {
                        x.First().DateManufactured,
                        Vehicles = x.ToList()
                    });

这会产生罚款,但我不确定x.First()部分。它有效,但感觉不太对劲。有人知道一种更优雅的方式来编码吗?

3 个答案:

答案 0 :(得分:7)

当您使用GroupBy时,它会创建IGrouping<TKey, TItem>,因此您只需执行以下操作:

var vehiclesGroupedByDate = vechicles.GroupBy(x => x.DateManufactured)
            .Select(x => new
                {
                    x.Key,
                    Vehicles = x.ToList()
                });

答案 1 :(得分:4)

我认为您的代码没有任何问题,但您也可以使用x.Key代替x.First().DateManufactured,而不需要创建另一个IEnumerable。

答案 2 :(得分:3)

GroupBy公开Key属性:

var vehiclesGroupedByDate = vechicles.GroupBy(x => x.DateManufactured)
    .Select(x => new
    {
        x.Key,
        Vehicles = x.ToList()
    });