在C#中排队
虽然这个问题听起来像是重复的,但我搜索了很多但却找不到合适的解决方案。
我有以下课程
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 changeInfoQueue = new Queue(); 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队列的示例数据。
我的问题 :
- 我需要根据ObjectType来整理changeInfoQueue。 我怎样才能做到这一点?
我的发现:
- 我找到了OrderBy 。 有可能使用它吗? 如果是这样,怎么样?
除此之外,我发现了priorityQueue。 对我来说最好的解决方案是什么?
编辑:
创建相关对象时会添加此队列的值。 (项目,边框等)并将其保存在本地XML文件中。 之后,它需要写入数据库。 这是通过使用线程来完成的,当我们保存这些数据时,必须以特定顺序保存它以避免外键冲突。 所以这个线程用于调用那些相关的方法。
我使用orderby如下:
Queue changeInfoQueue2 = changeInfoQueue.OrderBy(ChangeInfo => ChangeInfo.ObjectType);
然后抛出以下exception:
无法将类型’System.Linq.IOrderedEnumerable’隐式转换为’System.Collections.Generic.Queue’。 存在显式转换(您是否错过了演员?)
为什么要按队列中的对象类型进行排序? 根据它的定义,队列并不意味着以这种方式排序,而是打算作为先出先出的元素。
如果您只想要一个能够被订购的集合,那么可以使用List,也可以使用有序列表或为您拥有的不同类型的对象创建多个队列。
例如,如果你去超级市场,你有几个队列,每个不同的部分一个…将所有人放在同一个队列然后根据他们是否在“排序”他们没有任何意义对于屠夫或面包店。
当您需要“排队”时,您有一个队列…如果您不使用适当的构造,请不要尝试强制它进入队列。 (“如果你有锤子,一切看起来像钉子”……但它不应该)
虽然有关使用queue和OrderBy
都是有效的,但您仍可能希望在队列中对元素进行排序。
您可以基于IOrderedEnumerable
构建新队列:
Queue queue = new Queue (); queue.Enqueue("first"); queue.Enqueue("second"); queue.Enqueue("third"); queue.Enqueue("fourth"); // Builds a new queue. Items are now alphabetically ordered Queue orderedQueue = new Queue (queue.OrderBy(z => z));