2017-03-20 15 views
0

ObservableCollectionの処理順序に影響を与える簡単な方法はありますか?ObservableCollectionのシャニング処理シーケンス<T>(c#)

public class GeneratorObject : IComparable 
{ 
     int processingSequence {get; set;} 
     string property1 {get; set;} 
     Boolean property2 {get; set;} 

     public GeneratorObject(int processingSequence) 
     { 
      this.processingSequence = processingSequence; 
     } 

     public int CompareTo(object obj) 
     { 
      // Implementation 
     }    
} 

処理シーケンスは、すべての自然数が考えられます。

は、私は次のクラスを考えてみましょう。

私は本当にespeaciallyビューで、コレクションをソートしたいいけないそれらのいくつか

ObservableCollection<GeneratorObject> toIterate = new ObservableCollection<GeneratorObject>(); 

toIterate.Add(new GeneratorObject(99)); 
toIterate.Add(new GeneratorObject(1)); 
toIterate.Add(new GeneratorObject(10)); 
toIterate.Add(new GeneratorObject(6)); 

foreach (GeneratorObject field in toIterate) 
{ 
    // Manipulating the properties of field 
} 

の一部を反復します。反復の順序を変更したいだけです。最初に、シーケンス番号が最も小さい要素、... さらに重要ですが、イテレーションする間にアイテムを操作し、コレクションのコピーを使用することはできません。

IveはすでにIComparableを実装していて、簡単に言うことができると考えました。 UIとのバインディングを破棄せずにCollection.Sort()。

ありがとうございました。

+0

何を試しましたか?痛みを伴う明白な答えは、コレクションのコピーをソートすることです(最終的には、下記の1つの回答で推奨されています)。あなたがそれをしていない理由は何ですか?より具体的に、あなたが試したことを明確に示す良い[mcve]を提供し、何が問題になっているのかを具体的に説明してください。 –

+0

アドバイスをいただきありがとうございます。病気はより具体的なenxt時間をしようとする。対処しないという問題は、反復しながらアイテムを操作することです。 – theawak3r

+0

質問を編集して明確にしてください。あなたの明確化をしても、問題はまだ広いことに注意してください。つまり、ソートされた一連のインデックスを基になるコレクションに維持することができますが、反復処理中にコレクションを変更している場合は、最も低いシーケンスで操作を実行するたびにコレクションのリニアスキャンを行うだけです#、その最低の#を見つける。 –

答えて

0

コピーのヒントをありがとう。私はこれが良い答えであるかどうかは分かりませんが(特にパフォーマンスに関して)、私は次のように問題を解決しました。

var copy = toIterate.ToList(); 
copy.Sort(); 

// iterate through the sorted List 
foreach (GeneratorObject field in copy) 
{ 
    // get the original object regarding to this sorted item 
    GeneratorObject originalObjectForAction = getGeneratorObject(toIterate, field); 
    // do stuff with the original item 
} 

public GeneratorObject getGeneratorObject(ObservableCollection<GeneratorObject> list, GeneratorObject objekt) 
{ 
    foreach (DwhRoboterGeneratorObjekt field in list) 
    { 
     if (field == objekt) return field; 
    } 
    throw new Exception("Not found"); 
} 
0

あなたはそれを並べ替え、リストのcopyを作成し、copyリスト繰り返すことができます:それはUIの順序を変更することはありませんので、ここでの並べ替えアクションが異なるリスト上で実行される

 //ObservableCollection<GeneratorObject> toIterate; 
     // I am assuming that 'toIterate' is not null and bound to the UI 
     toIterate.Add(new GeneratorObject(99)); 
     toIterate.Add(new GeneratorObject(1)); 
     toIterate.Add(new GeneratorObject(10)); 
     toIterate.Add(new GeneratorObject(6)); 

     var copy = toIterate.ToList(); 
     copy.Sort(); 

     foreach (GeneratorObject field in copy) 
     { 

     } 

を。

+0

答えをありがとう。問題は、イテレーション中にオブジェクトを操作していることです。私はコピーするというアイデアも持っていましたが、実際のオブジェクトへの参照を失ってしまいました。 – theawak3r

0

反復処理中にリストが変更されている場合は、反復処理ではなく、リストが空になるまでループして、反復ごとにminを見つけることができます。

while (toIterate.Any()) 
{ 
    GeneratorObject generatorObject = toIterate.Min(); 
    // do something with it 
}