我从服务中获得以下数据。我必须在某些条件下过滤它。
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#中选择并同时编辑具有相同列的行?有任何想法吗?
答案 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;
});
}