2012-04-19 8 views
4

私はList<int> allIDsのIDのリストを元の順序で含んでいます。私は、ユーザーがこのリストから別のList<int> selectedIDsにIDを追加したり削除したりすることができる要素選択機能を作成しています。今、私はこれをすべて稼働させていますが、ユーザーが同じ要素を削除して後で追加すると、リストの最後に追加されます(selectedIDs.Add(id))。C#の既存のリストと比較してリストをソートする方法は?

以前の場所への参照として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... } 

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

+0

[SortedList Class](http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx)の使用に異論はありますか? –

+4

リストは明らかにソートされていません... –

+0

@JacekGorgoń男、質問を読んだ当日ではありません。 : –

答えて

5

私が正しくあなたの条件を理解している場合:

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

これはオリジナルの、完全なリストの各IDのインデックスにより選択されたIDのリストを注文します。

+0

広範なテストの結果、10件中9件で動作しますが、ソートを適用せずにリストの先頭に追加されているアイテムがあります –

+1

@KrisSelbekk:もしあなたがそれを再現できるのであれば、他の人にとっても興味深いかもしれない新しい質問をするべきです。例を見せてもらえますか?その理由は[LINQの遅延実行](https:// msmvps.com/blogs/jon_skeet/archive/2008/02/28/implementing-deferred-execution-and-a-potential-trap-to-avoid.aspx)?ToList()を呼び出すことで簡単に回避できます。終わり。 –

1

擬似コード:

インデックスの要素を1番目のリストから探します。

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

Else index = x;

index = x - 1の要素を取ります。

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

エルス

、インデックスxでの要素と再びループ - 2、もしX - 2> = 0

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

1

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

1

1つのオプションはList<int>ではなくList<MyClass>であることがあります。 MyClassには、intbool shouldDisplayの2つのプロパティがあります。最初のリストから項目を削除するのではなく、それらを隠しとしてマークするか、または表示しないことができます。それらを取り除くには、再び「可視」に設定してください。

1

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

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(); 

を。

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順序に従ってソートされます。

関連する問題