4

この質問は重複しているように聞こえますが、よく検索しましたが、適切な解決策が見つかりませんでした。

私は次のクラスを持っています

public enum ChangeType
{ 
    Add,
    Modify,
    Delete
}



public enum ChangedObjectType
{ 
    Project,
    Customer,
    Border,
    Photo
}

public struct ChangeInfo
{
    public ChangeType typeofChange { get; private set; }
    public ChangedObjectType objectType { get; private set; }

    public string objectID { get; private set; }

    public ChangeInfo(ChangeType changeType, ChangedObjectType changeObj, string objectId):this()
    {
        typeofChange = changeType;
        objectType = changeObj;
        objectID = objectId;
    }

}

スレッド :

public class ChangeInfoUploader
{ 
    static Queue<ChangeInfo> changeInfoQueue = new Queue<ChangeInfo>();
    static Thread changeInfoUploaderThread = new Thread(new ThreadStart(ChangeInfoUploaderProc));
    static bool isStarted = false;
    static Project currentProject;

    public static void Initialize(Project curproject)
    {
        currentProject = curproject;
        isStarted = true;
        changeInfoUploaderThread.Start();
        ResumeData();
    }

    static void ChangeInfoUploaderProc()
    {
        while (isStarted)
        {
            if (currentProject != null)
            {
                ChangeInfo? addToDb = null;

             // I need to sort changeInfoQueue before dequeue
                lock (changeInfoQueue)
                {
                    if (changeInfoQueue.Count != 0)
                        addToDb = changeInfoQueue.Dequeue();
                }
            }
        }
        Logdata();
        changeInfoUploaderThread.Abort();
    }
}

これは、changeInfoQueue キューのサンプル データです。

<Info TypeofChange="Add" ObjectType="Customer" ObjectId="0005" />
<Info TypeofChange="Add" ObjectType="Customer" ObjectId="0006" />
<Info TypeofChange="Add" ObjectType="Customer" ObjectId="0007" />
<Info TypeofChange="Add" ObjectType="Photo" ObjectId="01a243f5-4894-4d99-8238-9c4cd3" />

私の質問 :

  • ObjectType に基づいて changeInfoQueue を整理する必要があります。どうやってやるの?

私の調査結果:

  • OrderByを見つけました。それを使用することは可能ですか?もしそうなら、どのように?

それに加えて、priorityQueue を見つけました。私にとって最善の解決策は何ですか?

編集:

このキューの値は、関連するオブジェクトが作成されるときに追加されます。(プロジェクト、ボーダーなど) を作成し、ローカルの XML ファイルに保存します。その後、データベースに書き込む必要があります。これはスレッドを使用して実現されます。このデータを保存するときは、外部キー違反を避けるために特定の順序で保存する必要があります。したがって、このスレッドは関連するメソッドを呼び出すために使用されます。

次のように orderby を使用しました。

Queue<ChangeInfo> changeInfoQueue2 = changeInfoQueue.OrderBy(ChangeInfo => ChangeInfo.ObjectType);

次に、次の例外をスローします。

タイプ 'System.Linq.IOrderedEnumerable' を 'System.Collections.Generic.Queue' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

4

2 に答える 2

14

キュー内のオブジェクトのタイプで並べ替えたいのはなぜですか? 定義上、キューはそのように順序付けられることを意図したものではなく、先入れ先出しの要素として機能することを意図しています。

順序付け可能なコレクションが必要な場合はリストを使用し、順序付けられたリストを使用するか、さまざまな種類のオブジェクトに対していくつかのキューを作成します。

たとえば、スーパー マーケットに行くと、複数のキューがあり、各セクションに 1 つずつあります... すべての人を同じキューに入れ、その中にいるかどうかに基づいて「順序付け」するのは意味がありません。肉屋やパン屋に。

物事を「キューに入れる」必要があるときはキューがあります...適切な構成を使用しない場合は、強制的にキューに入れようとしないでください。(「ハンマーを持っていると、すべてが釘のように見えます」...しかし、そうすべきではありません)

于 2013-01-18T10:19:24.497 に答える
8

キューの使用について述べられていることはすべてOrderBy有効ですが、それでもキュー内の要素を並べ替えたい場合があります。

以下に基づいて新しいキューを作成できますIOrderedEnumerable

Queue<string> queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
queue.Enqueue("third");
queue.Enqueue("fourth");

// Builds a new queue. Items are now alphabetically ordered
Queue<string> orderedQueue = new Queue<string>(queue.OrderBy(z => z));
于 2013-01-18T10:38:46.497 に答える