C# 如果不精确,则匹配

C# 如果不精确,则匹配,c#,algorithm,linq,C#,Algorithm,Linq,你们能帮我吗?因为我不能为下面的问题想出一个有条理的方法 下面的xml文档已经设置了按Id分组的个人记录。我想搜索一个节点,有条件地基于其他两个属性(MinAge、MaxAge)。一切正常,我可以根据Id和年龄参数搜索特定节点 <Group Id="189" Description="189 T1" MinAge="20" MaxAge="30"/> <Group Id="189" Description="189 T2" MinAge="31" MaxAge=

你们能帮我吗?因为我不能为下面的问题想出一个有条理的方法

下面的xml文档已经设置了按Id分组的个人记录。我想搜索一个节点,有条件地基于其他两个属性(MinAge、MaxAge)。一切正常,我可以根据Id和年龄参数搜索特定节点

    <Group Id="189" Description="189 T1" MinAge="20" MaxAge="30"/>
    <Group Id="189" Description="189 T2" MinAge="31" MaxAge="40"/>
    <Group Id="190" Description="190 T1" MinAge="20" MaxAge="30"/>
    <Group Id="190" Description="190 T2" MinAge="35" MaxAge="45"/>
    <Group Id="190" Description="190 T3" MinAge="49" MaxAge="50"/>
    <Group Id="191" Description="191 T1" MinAge="20" MaxAge="30"/>
    <Group Id="193" Description="193 T1" MinAge="18" MaxAge="50"/>

var allGroup = XDocument.Parse("xml string");

        var specificGroup =
            allGroup.Descendants("Group").Where(e => e.Attribute("Id").Value == Id &&
            int.Parse(e.Attribute("MinAge").Value) >= Age &&
            int.Parse(e.Attribute("MaxAge").Value) <= Age)

var allGroup=XDocument.Parse(“xml字符串”);
特定组=
allGroup.substands(“Group”)。其中(e=>e.Attribute(“Id”)。Value==Id&&
int.Parse(e.Attribute(“MinAge”).Value)>=年龄&&

int.Parse(e.Attribute(“MaxAge”).Value)只是一些经典算法:

int target = 190; // target find value
int min = int.MaxValue;
Node best = null;
foreach (var node in nodes) {
   int num = getNum(node.Describtion); // get the number from string
   if (Math.Abs(target - num) < min) {
     min = Math.Abs(target - num);
     best = node;
   }
}
int target=190;//目标查找值
int min=int.MaxValue;
节点最佳值=null;
foreach(节点中的var节点){
int num=getNum(node.description);//从字符串中获取数字
如果(数学绝对值(目标-数值)

这将引导您找到精确匹配(
min==0
,在这种情况下),或者如果找不到,则指向最接近的年龄(或大或小)。结果最佳节点将位于
best
变量中。

这有点复杂,但这个节点应该可以满足您的需要。
var specificGroup=(allGroup.substands(“Group”).Where(e=>e.Attribute(“Id”).Value==Id&&int.Parse(e.Attribute(“MinAge”).Value)=Age.Any())
?allGroup.substands(“Group”)。其中(e=>e.Attribute(“Id”).Value==Id&&int.Parse(e.Attribute(“MinAge”).Value)=年龄)
:(allGroup.subjects(“Group”).Where(e=>e.Attribute(“Id”).Value==Id.Any())
?allGroup.substands(“Group”).Where(e=>e.Attribute(“Id”).Value==Id).min(Math.Abs(Age-int.Parse(e.Attribute(“MinAge”).Value))+Math.Abs(Age-int.Parse(e.Attribute(“MaxAge”).Value)))
:(allGroup.substands(“Group”).Where(e=>int.Parse(e.Attribute(“MinAge”).Value)=Age)).min(Math.Abs(Id-e.Id)).Any()
? allGroup.substands(“Group”).Where(e=>int.Parse(e.Attribute(“MinAge”).Value)=Age.min(Math.Abs(Id-e.Id))

:allGroup.substands(“Group”).min(e=>.min(Math.Abs(Age-int.Parse(e.Attribute(“MinAge”).Value))+Math.Abs(Age-int.Parse(e.Attribute(“MaxAge”).Value))+Math.Abs(Id-e.Id))@Jodrell,对不起。不确定你所说的话到底是什么意思,你首先需要定义搜索条件。您希望返回的(100,51)应该是“189 T2”-第一学期最接近,或者是“193 T1”-第二学期更接近?为什么不能更改MinAge属性以包括您的预期最低年龄?如果需要另一个包含密切匹配的列表,则可以向计划标记添加CloseMatchYears属性,该属性包含在没有精确匹配的情况下可以应用密切匹配的年数