-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以上の場合、サイド 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 に答える