4

List<int> allIDs元の順序で ID のリストを含む があります。ユーザーがこのリストから別のリストにIDを追加および削除できるようにする要素チューザーを作成していますList<int> selectedIDs。今、私はこれをすべて稼働させていますが、ユーザーが同じ要素を削除して後で追加すると、リストの最後に追加されます ( selectedIDs.Add( id ))。

allIDs以前の場所への参照として使用して、要素を元の位置に挿入したい。

すべてをコンテキストに入れるためのリストの抜粋を次に示します。

List<int> allIDs = new List<int> {10, 11, 9, 155, 12, 299, 15...};
List<int> selectedIDs = new List<int> { 10, 9, 155, 299, 15... }

ここで、id=299 をselectedIDs-list から削除したとしましょう。後でもう一度追加しようとします。155と の間に挿入するにはどうすればよい15ですか? メソッドを使用してリストのどこにでも挿入できることはわかっていlist.Insert(obj, index)ますが、これをプログラムで可能な限り簡単な方法で行うにはどうすればよいでしょうか?

4

6 に答える 6

6

私があなたの要件を正しく理解した場合:

var ordered = selectedIDs.OrderBy(sID => allIDs.IndexOf(sID));

これにより、選択したIDのリストが、元の完全なリスト内の各IDのインデックス順に並べ替えられます。

于 2012-04-19T14:57:37.030 に答える
1

1 つのオプションは、List<MyClass>ではなく を使用することList<int>です。MyClass には、 と の 2 つのプロパティがintありbool shouldDisplayます。最初のリストから項目を削除するのではなく、非表示または非表示としてマークすることができます。削除を取り消すには、再度「表示」に設定します。

于 2012-04-19T15:05:02.600 に答える
1

疑似コードで:

要素のインデックスについては、最初のリストを参照してください。

このインデックスが 0 の場合、要素をリストの先頭に追加します。

それ以外のインデックス = x;

index = x - 1; の要素を取得します。

インデックス x - 1 の要素がリストにある場合は、新しい要素を直後に追加します。

それ以外の場合、x - 2 >= 0 の場合は、インデックス x - 2 の要素で再度ループします。

リストに既に含まれている要素のインデックスを最終的に取得し、このインデックス + 1 に新しい要素を挿入します。

于 2012-04-19T14:58:33.020 に答える
1

List の代わりにSortedDictionaryを使用するとどうなりますか? キーはインデックス、値は ID です。

于 2012-04-19T15:01:01.947 に答える
1

ティムの答えは本当にコンパクトでクールですが、かなり厄介な複雑さがあります。以下は、コンパクトではありませんが、より大きなリストでより速く、より使いやすくなるはずです。

public class IdWithFlag
{
     public int Id { get; set; }
     public bool Selected { get; set; }
}

Dictionary<int, IdWithFlag> allIDs = ... // populate somehow, perhaps a custom cast operator would help

選択した ID を追加/削除するたびに、次のように他のリストを再生成します。

allIDs[currentlyChangedId].Selected = ... // added or removed?

List<int> selectedIDs = allIDs.Values
    .Where(id => id.Selected)
    .Select(id => id.Id)
    .ToList();

はるかに複雑ですが、計算の複雑さが向上します。

于 2012-04-19T15:07:11.297 に答える
1

これは最も効率的な答えではありませんが、コーディングが最も簡単だと思います。

List<int> allIDs = new List<int> { 10, 11, 9, 155, 12, 299, 15 };
List<int> selectedIDs = new List<int> { 299, 10, 9, 15, 11 };

// this will ensure the sort order...
var newSel = (from a in allIDs
    join s in selectedIDs on a equals s
    select a).ToList();

selectedIDs = newSel;

結果の出力は、常にallIDs番号順にソートされます。

于 2012-04-19T15:08:48.487 に答える