过滤和编辑列表数据

时间:2017-08-09 09:24:45

标签: c# .net linq c#-4.0

我从服务中获得以下数据。我必须在某些条件下过滤它。

Train    Manufacturer        Model          Type      Name           EnableQuery

Train2   RSS                 Model123       City      "C-124"           1

Train2   ABC                 Iron-Bar       Village   "H-78"            0 

Train2   AHAJ-Manufacturer   Steel-123      City      "HJ-TY"           0

Train2   ABC                 AmazeModel     City      "SD-12"           1

Train1   JK                  Platinum-123   City      "HJK-2728"        1

“Train”字段重复多次时,我的条件是这样的:

我必须选择“类型”“名称”,其中模型“Steel-123”,是的,这是一个硬编码值如果没有找到,请留空。我必须选择“制造商”“型号”,其中“型号”不等于“ Steel-123“,取第一个值为空白。

我必须添加“EnableQuery”值。

我的预期输出是:

Train    Manufacturer        Model          Type      Name           EnableQuery

Train2   RSS                 Model123       City      "HJ-TY"           2

Train1   JK                  Platinum-123   City      "HJK-2728"        1

我从一个我无法控制的服务中获取原始输入。

public class Train
{
        public string Train { get; set; }
        public string Manufacturer { get; set; }
        public string Model { get; set; }
        public string Type { get; set; }
        public string Name { get; set; }
}

List<Train> lstTr = //from service;

我试图在LINQ中实现Group by,但它不能解决我的目的,因为即使在group by中也有3种不同的条件。

如何在C#中选择并同时编辑具有相同列的行?有任何想法吗?

1 个答案:

答案 0 :(得分:1)

将您的Train课程重命名为TrainRecord,因为它包含一个名为Train的属性,这是非法的。

static IEnumerable<TrainRecord> FunnyTrainAggregator(IEnumerable<TrainRecord> trains)
{
    const string steel123Name = "Steel-123";

    return trains
        .GroupBy(t => t.Train, (key, values) =>
        {
            var trainsInGroup = values.ToList();
            TrainRecord result;
            if (trainsInGroup.Count > 1)
            {
                var steel = trainsInGroup.FirstOrDefault(t => t.Name == steel123Name);
                var nonsteel = trainsInGroup.FirstOrDefault(t => t.Name != steel123Name);
                result = new TrainRecord
                {
                    Train = key,
                    Manufacturer = nonsteel?.Manufacturer,
                    Model = nonsteel?.Model,
                    Type = steel?.Type,
                    Name = steel?.Name,
                    EnableQuery = trainsInGroup.Sum(t => t.EnableQuery)
               };
            }
            else
                result = trainsInGroup[0];
            return result;
        });
}