-1

我有以下 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,我想获取 Side 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.`

等结束了,check Side 222 against 111, 333, 555, 777, 999.

如果有多个选项返回高于 1 的结果,我想全部获取,例如:

111 and 444
111 and 666
222 and 777

等等

我想用 LINQ 来做,但它似乎是非常复杂的逻辑,所以这里需要你的帮助。

4

1 回答 1

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 };
于 2013-09-11T10:35:57.260 回答