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