【问题标题】:Filtering and editing the list data过滤和编辑列表数据
【发布时间】:2017-08-09 09:24:45
【问题描述】:

我有以下来自服务的数据。我必须在某些条件下对其进行过滤。

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" 字段重复多次时,我的情况如下:

我必须选择 "Type""Name" 其中 Model 是 "Steel-123" ,是的,这是一个硬编码值如果找不到,请将其留空。我必须选择 "Manufacturer""Model" 其中 "Model" 不等于 " 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# 中选择并同时编辑具有相同列的行?有任何想法吗?

【问题讨论】:

    标签: c# .net linq c#-4.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;
            });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多