C# 需要LINQ到XML计算查询帮助
我有以下XML文件:C# 需要LINQ到XML计算查询帮助,c#,xml,linq,C#,Xml,Linq,我有以下XML文件: <Price id="70"> <Side id="111" option="1" startPrice="3.5"/> <Side id="222" option="2" startPrice="1.25"/> </Price> <Price id="20"> <Side id="333" option="1" startPrice="1.25"/> <
<Price id="70">
<Side id="111" option="1" startPrice="3.5"/>
<Side id="222" option="2" startPrice="1.25"/>
</Price>
<Price id="20">
<Side id="333" option="1" startPrice="1.25"/>
<Side id="444" option="2" startPrice="3.25"/>
</Price>
<Price id="22">
<Side id="555" option="1" startPrice="1.25"/>
<Side id="666" option="2" startPrice="3.25"/>
</Price>
<Price id="23">
<Side id="777" option="1" startPrice="2.25"/>
<Side id="888" option="2" startPrice="3.25"/>
</Price>
<Price id="24">
<Side id="999" option="1" startPrice="2.25"/>
<Side id="000" option="2" startPrice="3.25"/>
</Price>
如果下面的计算大于或等于1,我想获取侧面ID
例如:
1/((1/3.5)+(1/1.25))
等于0.9210526315789471,因此它对我来说无关紧要
XML有时有3个边,有时(如上面的示例)有2个边
我必须对照其他选项检查每个选项(1/2/3)
,因此,如果我检查选项1,我必须对照选项2或3(如果存在)进行检查,如果我检查选项2,我必须对照选项1和3进行检查,等等
所以,总结一下,逻辑应该是这样的:
Check Side ID 111 against `222, 444, 666, 888, 000.`
完成后,对照111、333、555、777、999检查222面。
如果有多个选项返回的结果高于1,我希望获得所有选项,例如:
111 and 444
111 and 666
222 and 777
等等
我曾想过使用LINQ进行此操作,但它的逻辑似乎非常复杂,因此这里需要您的帮助。首先-创建类来保存数据和逻辑:
public class Side
{
public int Id { get; set; }
public int Option { get; set; }
public decimal StartPrice { get; set; }
public decimal CheckAgainst(Side otherSide)
{
return 1 / ((1 / StartPrice) + (1 / otherSide.StartPrice));
}
}
下一步-从xml中获取边:
var sides = xdoc.Descendants("Side")
.Select(s => new Side {
Id = (int)s.Attribute("id"),
Option = (int)s.Attribute("option"),
StartPrice = (decimal)s.Attribute("startPrice")
}).ToList();
最后-过滤掉您需要的边:
var result = from side in sides
from otherSide in sides.Where(x => x.Option != side.Option)
where side.CheckAgainst(otherSide) > 1
select new { side, otherSide };
您应该从在标准
class
对象上实现逻辑开始,然后专注于将XML解析到您的对象中。@IdoLazar您能分享一下您迄今为止的尝试吗?
var result = from side in sides
from otherSide in sides.Where(x => x.Option != side.Option)
where side.CheckAgainst(otherSide) > 1
select new { side, otherSide };