我有以下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"/>
<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 / ((1 / startPrice) + (1 / startPrice))
如果以下计算大于或等于 1 ,我想获得边ID。
例如:
1 / ((1 / 3.5) + (1 / 1.25))
等于 0.9210526315789471 ,所以它与我无关。
XML有时会有3个Side,有时(如上例所示)它有2个Side。
我必须针对其他选项检查每个选项(1/2/3)
,所以如果我检查选项1,我将必须针对选项2或3(如果存在)进行检查,如果我正在检查选项2我将不得不针对选项1和3等进行检查。
所以,只是一个总结,逻辑应该是这样的:
Check Side ID 111 against `222, 444, 666, 888, 000.`
完成后,check Side 222 against 111, 333, 555, 777, 999.
如果有多个选项返回高于1的结果,我希望得到所有这些选项,例如:
111 and 444
111 and 666
222 and 777
等
我想过用LINQ做这件事,但它似乎是非常复杂的逻辑,所以这里需要你的帮助。
答案 0 :(得分:1)
首先 - 创建用于保存数据和逻辑的类:
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 };