需要根据规则匹配将数据包拆分并分发给正确的所有者

  • 本文关键字:所有者 拆分 数据包 规则 c#
  • 更新时间 :
  • 英文 :


我需要根据一些规则和名称拆分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);

最新更新