質問

Linqで何かを探すのに苦労しています-誰かが私にいくつかのヒントをくれるかもしれません。

新しいXMLに変換する必要があるXMLがあります。これに関する問題は、それを正しくするために、変換の反復がいくつか必要だということです。

ソースは次のようになります。

    <Meals>
      <ketchup/>
      <steak/>
      <mustard/>
      <thigh/>
      <fillet/>
      <penne/>
      <drumstick/>
      <steak/>
      <ketchup/>
      <fillet/>
      <fillet/>
      <macaroni/>
      <drumstick/>
      <thigh/>
      <ketchup/>
      <thigh/>
      <fillet/>
    </Meals>

これで終わりにしたいのは:

    <Meals>
      <Meal>
        <ketchup/>
        <steak/>
        <mustard/>
        <thigh/>
      </Meal>
      <Meal>
        <fillet/>
        <penne/>
        <drumstick/>
      </Meal >
      <Meal>
        <steak/>
        <ketchup/>
      </Meal>
      <Meal>
        <fillet/>
      </Meal>
      <Meal>
        <fillet/>
        <macaroni/>
        <drumstick/>
      </Meal>
      <Meal>
        <thigh/>
        <ketchup/>
      </Meal>
      <Meal>
        <thigh/>
        <fillet/>
      </Meal>
    </Meals>

ここでのロジックは次のとおりです:

  • <steak>および<fillet>は牛肉です 肉-以前に発生するもの またはそれらの後、それは牛肉ではありません 別の食事の一部でない限り、食事の一部。牛肉が牛肉の後に発生した場合、新しい牛肉の要素で新しい食事が作成されます。
  • <thigh>および<drumstick>は 鶏肉-発生するもの それらの前または後ではない 鶏肉は、別の食事の一部でない限り、食事の一部です。鶏肉の後に鶏肉が発生した場合、新しい鶏肉の要素で新しい食事が作成されます。
  • <macaroni>および<penne>は、パスタではないパスタの前または後に発生するパスタです。 別の食事の一部でない限り、食事の一部。パスタの後にパスタが発生した場合、新しいパスタの要素で新しい食事が作成されます。
  • <ketchup>および<mustard>は 調味料-任意の 食事。

ElementsAfterSelf、ElementsBeforeSelf、TakeWhileから始めましたが、上記の実行方法を理解した上で壁にぶつかりました。 VB.NETとLinqを使用していますが、C#を読むことができます。

考えやポインタはありますか?

役に立ちましたか?

解決

別のフォーラムから良い答えを得て、ここに最終版があります:

    Dim meals As XElement = <Meals>
                                <ketchup/>
                                <steak/>
                                <mustard/>
                                <thigh/>
                                <fillet/>
                                <macaroni/>
                                <drumstick/>
                                <thigh/>
                                <ketchup/>
                                <thigh/>
                                <fillet/>
                            </Meals>
    Dim newMeals As XElement = <Meals/>
    Dim meal As XElement = <Meal/>
    Dim hasBeef As Boolean
    Dim hasChicken As Boolean
    For Each m In meals.Descendants()
        Select Case m.Name
            Case Is = "steak", "fillet"
                If hasBeef Then
                    newMeals.Add(meal) 
                    meal = <Meal/> 
                    hasChicken = False
                Else
                    hasBeef = True
                End If
                meal.Add(m)
            Case Is = "drumstick", "thigh"
                If hasChicken Then
                    newMeals.Add(meal)
                    meal = <Meal/>
                    hasBeef = False
                Else
                    hasChicken = True
                End If
                meal.Add(m)
            Case Else
                meal.Add(m)
        End Select
    Next
    newMeals.Add(meal)

他のヒント

LINQPad が役立つ場合があります。私はあなたの問題を試してみますが、あなたが理解したように例と一致しないので、あなたが指定した組み合わせロジックについては明確ではありません(例えば、なぜすべての食事にマスタードがないのですか?)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top