需要LINQ to XML计算查询帮助

时间:2013-09-11 09:48:21

标签: 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"/>
    <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做这件事,但它似乎是非常复杂的逻辑,所以这里需要你的帮助。

1 个答案:

答案 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 };