【发布时间】:2013-01-02 00:42:39
【问题描述】:
尽管这个问题听起来很重复,但我搜索了很多,但找不到合适的解决方案。
我有以下课程
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”。存在显式转换(您是否缺少演员表?)
【问题讨论】:
-
如果您知道
OrderBy,请说明您是如何尝试使用它的以及您遇到的问题。 -
队列就是队列——对队列进行排序毫无意义。想象一下超市里的队列,人们被称为按字母顺序排列的……使用 SortedDictionary 代替。 (或者如果你只是想强制一些特殊条目,请查看 PriorityQueues)
-
没有足够的细节说明为什么需要这个,队列数据结构没有关于排序的内容,它是一组按添加顺序排列的项目,因此您需要自行更新队列顺序或仅排序一些临时位置的物品也可以吗?
-
你可以使用 Linq。看这篇文章stackoverflow.com/questions/561644/queue-ordering
-
你真的需要队列类吗?毕竟,它的主要目的是保持添加项目的顺序。也许您可以使用 List 或其他一些集合?
标签: c# .net collections queue priority-queue