C# 需要LINQ到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"/> <

我有以下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,我想获取侧面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 };