2017-08-09 62 views
2

我從服務中獲得以下數據。我必須在一些條件下過濾它。過濾和編輯列表數據

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 

「火車」場重複不止一次我有一個是這樣的一個情況:

我必須選擇「類型」「名稱」其中型號是「鋼鐵-123」,是的,這是一個硬編碼值,如果它沒有找到不去管它blank.I必須選擇「製造商」「模型」其中「型號」不等於「鋼-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落實集團,但它不會解決我的目的,因爲有3種不同的情況下,即使按組。

如何選擇並同時編輯C#中具有相同列的行?有任何想法嗎?

回答

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; 
     }); 
}