【问题标题】:sort a queue in C#在 C# 中对队列进行排序
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 在创建相关对象时添加此队列值。 (项目、边框等)并将其作为 xml 文件保存在本地。之后它需要写db。这是使用线程完成的,当我们保存这些数据时,需要按特定顺序保存,以避免外键使用
  • 所以?使用列表正确排序。问题不在于您尝试解决错误的问题,而是您尝试将队列用于其他数据类型可以更好地解决的问题。
【解决方案2】:

虽然关于使用队列和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));

【讨论】:

  • 它说“至少一个对象必须实现 IComparable。”这意味着我需要使用 IComparable 来实现我的课程吗?
  • @TilT 是的。详情请看这个答案:stackoverflow.com/a/14141926/870604
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
相关资源
最近更新 更多