我需要根据一些规则和名称拆分packet
,我需要将这些规则和名称与不同的列表NameOwnersBasedOnRule
匹配。
我有一个类NameOwnersBasedOnRule
,在那里我为一个名称定义了不同的规则\所有者集,规则和所有者的数量不是固定的。
var nameOwnersBasedOnRule = new List<NameOwnersBasedOnRule>
{
new NameOwnersBasedOnRule
{
Name = "Name1", Owners = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Rule1", "Owner1"),
new KeyValuePair<string, string>("Rule2", "Owner2"),
new KeyValuePair<string, string>("Rule3", "Owner3")
}
},
new NameOwnersBasedOnRule
{
Name = "Name2", Owners = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Rule2", "Owner2")
}
},
new NameOwnersBasedOnRule
{
Name = "Name3", Owners = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("Rule1", "Owner1"),
new KeyValuePair<string, string>("Rule1", "Owner2"),
new KeyValuePair<string, string>("Rule1", "Owner3")
}
}
};
我有packet
的列表,每个数据包都有一些与之相关的Rule
,而Name
是嵌套的InstanceData
的一部分,可以对多个InstanceName重复。这是一个样本数据包,
var dataPacket = new Packet
{
Id = new Guid("2e08bd98-68eb-4358-8efb-9f2adedfb034"),
Rules = new List<string> { "Rule1", "Rule2" },
Results = new Result
{
ResultName = "ResultName1",
Instances = new List<Instance>
{
new Instance
{
InstanceName = "InstanceName1",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V1"},
new InstanceData{Name = "Name2", Value = "V2"},
new InstanceData{Name = "Name3", Value = "V3"},
new InstanceData{Name = "Name4", Value = "V4"}
}
},
new Instance
{
InstanceName = "InstanceName2",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V5"},
new InstanceData{Name = "Name2", Value = "V6"},
new InstanceData{Name = "Name3", Value = "V7"},
new InstanceData{Name = "Name4", Value = "V8"}
}
}
}
}
};
- 这个数据包有多个名称,我需要根据
List<NameOwnersBasedOnRule>
中的匹配规则和名称对其进行拆分,并需要分发相关的所有者
对于上述数据示例数据包;规则1"规则2";,因此
Name1应分配给Owner1和Owner2。
Name2仅适用于Owner2。
姓名3给所有所有者所有者所有者1、所有者2、所有者3
'Name4'到NONE
每个所有者的预期数据应该是这样的,
var owner1Data = new Packet
{
Id = new Guid("2e08bd98-68eb-4358-8efb-9f2adedfb034"),
Results = new Result
{
ResultName = "ResultName1",
Instances = new List<Instance>
{
new Instance
{
InstanceName = "InstanceName1",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V1"},
new InstanceData{Name = "Name3", Value = "V3"}
}
},
new Instance
{
InstanceName = "InstanceName2",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V5"},
new InstanceData{Name = "Name3", Value = "V7"}
}
}
}
}
};
var owner2Data = new Packet
{
Id = new Guid("2e08bd98-68eb-4358-8efb-9f2adedfb034"),
Results = new Result
{
ResultName = "ResultName1",
Instances = new List<Instance>
{
new Instance
{
InstanceName = "InstanceName1",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V1"},
new InstanceData{Name = "Name2", Value = "V2"},
new InstanceData{Name = "Name3", Value = "V3"}
}
},
new Instance
{
InstanceName = "InstanceName2",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name1", Value = "V5"},
new InstanceData{Name = "Name2", Value = "V6"},
new InstanceData{Name = "Name3", Value = "V7"},
}
}
}
}
};
var owner3Data = new Packet
{
Id = new Guid("2e08bd98-68eb-4358-8efb-9f2adedfb034"),
Results = new Result
{
ResultName = "ResultName1",
Instances = new List<Instance>
{
new Instance
{
InstanceName = "InstanceName1",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name3", Value = "V3"}
}
},
new Instance
{
InstanceName = "InstanceName2",
InstanceDatas = new List<InstanceData>
{
new InstanceData{Name = "Name3", Value = "V7"}
}
}
}
}
};
这是我所有的类结构,
public class NameOwnersBasedOnRule
{
public string Name { get; set; }
public List<KeyValuePair<string, string>> Owners { get; set; }
}
public class Packet
{
public Guid Id { get; set; }
public List<string> Rules { get; set; }
public Result Results { get; set; }
}
public class Result
{
public string ResultName { get; set; }
public List<Instance> Instances { get; set; }
}
public class Instance
{
public string InstanceName { get; set; }
public List<InstanceData> InstanceDatas { get; set; }
}
public class InstanceData
{
public string Name { get; set; }
public string Value { get; set; }
}
注意-
下面的方法将我的大packet
除以Name
private static IEnumerable<Packet> SplitByName(Packet packet)
{
var names = packet.Results.Instances
.SelectMany(it => it.InstanceDatas)
.Select(it => it.Name)
.Distinct()
.ToList();
IList<Packet> result = new List<Packet>();
foreach (var name in names)
{
var newInstances = packet.Results.Instances
.Select(it => new Instance
{
InstanceName = it.InstanceName,
InstanceDatas = it.InstanceDatas
.Where(it1 => it1.Name == name)
.ToList()
})
.Where(it => it.InstanceDatas.Any())
.ToList();
var newResult = new Result
{
ResultName = packet.Results.ResultName,
Instances = newInstances
};
result.Add(new Packet
{
Id = packet.Id,
Results = newResult
});
}
return result;
}
然后我们可以在一个查询中为每个所有者准备所需的结果吗
您可以使用此方法:
private Packet CreatePacket(string psOwner, Packet poSourcePacket, List<NameOwnersBasedOnRule> poRuleSet)
{
//Create new Output Packet
Packet loDestPacket = new Packet()
{
Id = poSourcePacket.Id,
Results = new Result()
{
ResultName = poSourcePacket.Results.ResultName,
Instances = new List<Instance>()
}
};
//Create a simple List with valid Names for Owner and for all Rules in the Source
IEnumerable<string> loList = poRuleSet
.Where(item => item.Owners
.Any(o => o.Value == psOwner && poSourcePacket.Rules.Contains(o.Key)))
.Select(item => item.Name);
//Add all Instance with InstanceData to the output Packet
loDestPacket.Results.Instances.AddRange(poSourcePacket.Results.Instances
.Where(item => item.InstanceDatas.Any(data => loList.Contains(data.Name)))
.Select(item => new Instance()
{
InstanceName = item.InstanceName,
InstanceDatas = new List<InstanceData>(item.InstanceDatas
.Where(data => loList.Contains(data.Name))
.Select(data => new InstanceData()
{
Name = data.Name,
Value = data.Value
}))
}));
return loDestPacket;
}
调用方法(针对Owner1(:
this.CreatePacket("Owner1", dataPacket, nameOwnersBasedOnRule);