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

为什么要按队列中的对象类型排序?根据其定义,队列并不意味着以这种方式排序,而是旨在作为先进先出的元素工作。

如果您只想要一个能够被排序的集合和有序列表,请使用列表,或者为您拥有的不同类型的对象创建多个队列。

例如,如果你去超市,你有几个队列,每个不同的部分一个......将所有人放在同一个队列中然后根据他们是否在“排序”他们是没有意义的对于屠夫或面包店。

当您需要“排队”事物时,您有一个队列......如果您不使用适当的构造,请不要尝试将其强制放入队列中。(“如果你有一把锤子,一切看起来都像钉子”......但它不应该)

于 2013-01-18T10:19:24.497 回答
8

尽管关于使用队列的所有内容OrderBy都是有效的,但您仍然可能希望对队列中的元素进行排序。

您可以基于 a 构建一个新队列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 回答