1

linq リストから複数のインデックスを削除したいのですが、次のコードを使用しています。

slidePart
         .Slide
         .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
         .ToList()
         .ForEach(pic => pic.Remove());

リストには 3 つの要素があり、1 番目と 3 番目の要素のみを選択し、ForEach を実行してそれらを削除します。

[編集]

問題は、インデックスが動的であることでもあります。

4

2 に答える 2

3
    var toRemove = new int[] { 1,2,.... };

    slidePart.Slide
        .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
        .Where((x, i) => toRemove.Contains(i) )
        .ToList()
        .ForEach(pic => pic.Remove());

リスト ( toRemove ) が大きい場合は、宣言を少し変更することで、( Containsの) 検索時間を O(n) から O(1) に短縮できます。toRemove

var toRemove = new HashSet<int>(new int[] { 1 });
于 2012-11-28T17:23:34.067 に答える
0

一般に、フィルターのインデックス付きオーバーロードを使用して、複数のインデックスでアイテムを選択できます。WhereLINQはコレクション(別のコレクションインスタンス)のビューのみを提供するため、元のコレクションを変更できないことに注意してください。メソッドが所有者からのアイテムの削除を処理する場合は可能かもしれませんがRemove、それは非常に特殊でまれなケースです。

あなたの場合、アイテムの入手は次のようになります

var toRemove = new[] { 1, 2, ... };

var itemsToBeRemoved = slidePart.Slide
    .Descendants<DocumentFormat.OpenXml.Presentation.Picture>()
    .Where((pic, index) => toRemove.Contains(index))
    .ToList();

ただし、アイテムを削除できるようにするには、コレクション自体で何らかのRemoveメソッドを呼び出す必要Descendantsがある場合や、シナリオで必要なまったく異なるアプローチがある場合があります。

于 2012-11-28T17:30:43.677 に答える