使用Stack结构的JSON反序列化会颠倒顺序
使用Newtonsoft JSO序列化器和堆栈数据结构.当我对结构进行挑选时,该顺序会逆转.比较数字和SS. 我在这里做错了什么还是有任何解决问题. using Newtonsoft.Json; using System; using System.Collections.Generic; class Example { public static void Main() { Stack numbers = new Stack(); numbers.Push("one"); numbers.Push("two"); numbers.Push("three"); numbers.Push("four"); numbers.Push("five"); string json = JsonConvert.Seriali
0 2024-04-20
编程技术问答社区
如何在一个字符串中找到匹配的一对大括号?
假设我有一个字符串"(付费) +(8个工作时间) +(公司规则)".现在,我想检查该完整的字符串是否被括号包围.基本上,我想检查字符串是否是这样的:"((付费) +(8个工作时间) +(公司规则))".如果它已经被括号包围了,那么我将保持原样,否则我将括号对完整的字符串应用,以便OUPUT是:"((支付) +(8个工作时间) +(公司规则)) +(公司规则)) ".通过计算括号的数量,我无法解决此问题. 任何人都可以建议解决方案吗? 在Stack.这样,每当您将项目弹出堆栈时,请检查它是否是0,这意味着与此闭合Paren相对应的开头Paren在字符串的开头.最后一次关闭的检查结果将告诉您您是否需要添加Parens. 示例: String s = "((paid for) + (8 working hours) + (company rules))"; var stack = new Stack(); bool isSurroundedByParens = f
0 2024-04-19
编程技术问答社区
堆栈清空异常
我得到一个空的例外.如果堆栈不是空的(有16个项目),该怎么可能? 我得到了错误的拍摄: 在 有人可以解释吗? 解决方案 您必须使用Stack之类的东西同步访问.最简单的方法是使用lock,然后您也可以将lock用于同步本身;所以流行音乐是: int item; lock (SharedMemory) { while (SharedMemory.Count == 0) { Monitor.Wait(SharedMemory); } item = SharedMemory.Pop(); } Console.WriteLine(item); 和推动是: lock (SharedMemory) { SharedMemory.Push(item); Monitor.PulseAll(SharedMemory); } 其他解决方案 堆栈如何满足且有16个项目?! 在多线程环境中,
0 2024-04-19
编程技术问答社区
堆栈<>在C#中的实现
我最近一直在实施递归目录搜索实现,并且我正在使用堆栈来跟踪路径元素.当我使用string.join()加入路径元素时,我发现它们被逆转了.当我调试该方法时,我查看了堆栈,发现元素本身在堆栈的内部数组中逆转,即最近的推动()ED元素是在内部数组的开始,而最近推动的最少push() ED元素在内部数组的末尾.这似乎是背包,非常违反直觉.有人可以告诉我为什么微软会以这种方式实现堆栈? 解决方案 我想你错了. 不是Stack.Push在内部数组的开头(没有)内部插入项目.相反,它是从顶部到底部列举的,因为这是一个人通过堆栈进行直观枚举的方式(想想一堆煎饼:您从顶部开始,然后向下工作). > 如果您从Visual Studio的调试器中查看集合的内容,我认为它将按照他们枚举的顺序向您展示 - 而不是它们内部存储的顺序*. . 在// (code to check array size) this._array[this._size++] = item; // (
0 2024-04-19
编程技术问答社区
在c#中对堆栈进行迭代的最快速方法
我觉得使用getEnumerator()和铸造ienumerator.current很昂贵.有更好的建议吗? 我愿意使用不同的数据结构,如果它提供具有更好性能的类似功能. 在思考之后: 通用堆栈会是一个更好的主意,以便不需要演员吗? 解决方案 您是否做过任何基准测试,还是只是直觉? 如果您认为大部分处理时间是花在堆栈中循环的,则应基于它进行基准测试,并确保就是这样.如果是,您有一些选择. 重新设计代码,使得不需要循环 找到更快的循环结构. (我建议仿制药也没关系.再一次,基准). 编辑: 可能不需要的循环的示例是您尝试在列表中进行查找或匹配两个列表或类似的示例.如果循环花费很长时间,请查看将列表放入二进制树或哈希地图是否有意义.创建它们的初始成本可能会有最初的成本,但是如果对代码进行了重新设计,则可能会通过o(1)查找来恢复. . 其他解决方案 Stack(与foreach一起)确实可以节省演员阵容,但实际上拳击并非全部 b
0 2024-04-18
编程技术问答社区
C# & .NET: stackalloc
我有一些有关stackalloc运算符功能的问题. 它实际上是如何分配的?我认为它可以做类似的事情: void* stackalloc(int sizeInBytes) { void* p = StackPointer (esp); StackPointer += sizeInBytes; if(StackPointer exceeds stack size) throw new StackOverflowException(...); return p; } 但是我已经做了一些测试,但我不确定这是如何工作的.我们无法确切知道它的作用以及它是如何做的,但是我想知道基本知识. 我认为堆栈分配(嗯,我实际上是确定的)比堆分配快.那为什么要这个示例: class Program { static void Main(string[] args) { Stopwatch sw1
0 2024-04-17
编程技术问答社区
如何在C#中删除一个不在堆栈顶部的堆栈项目
不幸的是,只能通过" pop"从堆栈中删除一个项目.堆栈没有"删除"方法或类似方法,但是我有一个堆栈(是的,我需要一个堆栈!),我需要从中删除一些元素. 有一个技巧吗? 解决方案 如果您需要删除不在顶部的项目,则需要堆栈以外的其他东西. 尝试从列表中实现自己的堆栈.然后,您可以实现自己的推动和弹出功能(在列表中添加和删除)和您自己的特殊PopFromThemiddle函数. 例如 public class ItsAlmostAStack { private List items = new List(); public void Push(T item) { items.Add(item); } public T Pop() { if (items.Count > 0) { T temp = items[items.C
0 2024-04-17
编程技术问答社区
C#检查表达式是否有效
表达式: "(a [i]+{ - 1}*(8-9))" 应该返回true,因为这样写语法是有效的.每个左边的支架在正确的位置都有一个右边的距离,并且所有支架都处于法律位置. 我试图通过一个堆栈来做到这一点,我知道我在哪里错了,但我想知道一种解决这个问题的相关方法. 谢谢! 我可怜的错误代码: string expression = "( a[i]+{-1}*(8-9) ) "; Stack expStack = new Stack(); List rightBracketsHolder = new List(); for (int i = 0; i
0 2024-04-17
编程技术问答社区
如何在C#中使用堆栈来计算Infix-Expression的输出?
我已经在Stackoverflow上找到了不同的解决方案,但是有些事情我不了解. 什么是计算e.g.:((1+(4*(4*(2+3)))的最佳方法)+((2+3)*(4*5))? 我的方法看起来如下,但我知道其中有很多错误: public static int ComputeInfix(string infix) { Stack operatorstack = new Stack(); Stack operandstack = new Stack(); for(int j = 0; j 0 && c
0 2024-04-17
编程技术问答社区
C#中存储的静态结构在哪里?
来自这个问题我知道 结构可以分配在堆栈或寄存器中,而不是在堆上分配 如果结构是堆上参考类型对象的一部分,则结构也将在堆上 但是,那不是对象的一部分,而是类似班级的静态成员的结构: public class Program { public static CustomStructType inst1; static void Main(string[] args) { //assigning an instance of value type to the field inst1 = new CustomStructType(); } } public struct CustomStructType { //body } 堆上不会有Program的实例.那么结构将在哪里存储? 这个问题是此已删除的问题.用户被删除了,因此问答答案随之而来.我仍然发现这个想法很有趣,调试结果甚至更
0 2024-04-17
编程技术问答社区
一个函数内的局部变量什么时候真正被分配了?
只是对此感到好奇.以下是相同功能的两个代码段: void MyFunc1() { int i = 10; object obj = null; if(something) return; } 另一个是... void MyFunc1() { if(something) return; int i = 10; object obj = null; } 现在,第二个是在某物是真的的吗?或局部堆栈变量(在当前范围内)总是在调用函数后立即分配,并且将返回语句移至顶部没有效果? dotnetperls.com的链接 说"当您称呼C#中的方法程序,即使您不访问函数调用中的变量,运行时都会分配一个单独的内存区域来存储所有本地变量插槽." 更新 这是这两个功能的IL代码的比较. func2指的是第二次.在两种情况下,变量似乎是在开始时分配的,尽管在func2()的情况下,稍后将其初始化.我想没有好处. 解决方案
0 2024-04-15
编程技术问答社区
确定哪一行代码抛出了异常
在dotnet中,一条线抛出异常并被捕获,我如何弄清楚哪个文件在哪个文件中抛出了例外?似乎相对简单,但我无法弄清楚... 解决方案 您只有在有可用的debug符号时才可以这样做. catch(Exception ex) { // check the ex.StackTrace property } 如果您想在VS中调试这种情况,最好只需检查Thrown Common Language Runtime Exceptions in Exceptions对话框的复选框,位于Debug菜单中.调试器一旦抛出了例外,即使在try块中也将突破. 其他解决方案 就个人而言,我只是记录了异常的tostring()返回值.包括整个堆栈跟踪.这是一行代码... DEAD简单. 其他解决方案 您可以使用 stackframe class : try { ... ... } catch(...) { StackFrame sf = new
0 2024-04-15
编程技术问答社区
我可以限制一个通用堆栈的深度吗?
是否有内置的方式来限制system.collection.generics.stack的深度?因此,如果您处于最大容量,推动新元素将删除堆栈的底部? 我知道我可以通过转换为数组并重建堆栈来做到这一点,但我认为可能已经有一种方法了. 编辑:我写了一个扩展方法: public static void Trim (this Stack stack, int trimCount) { if (stack.Count ( stack .ToArray() .Take(trimCount) ); }
0 2024-04-15
编程技术问答社区
C#堆栈队列组合
在c#中是否有一些已经定义的通用容器,可以同时用作堆栈和队列? 我只想能够将元素附加到末尾,或者是队列的前部 的前部 谢谢 解决方案 检查 linkedlist "> linkedlist class. LinkedList list = new LinkedList(); list.AddFirst(1); list.AddLast(2); list.AddFirst(0); 其他解决方案 这是我对不变的Deque的实现: http://blogs.msdn.com/ericlippert/archive/2008/02/02/immutability-in-c-part-eleven-eleven-eeleven-eeleven-eeleven-working-double-double-queue.aspx 请注意,这是 double-dended-quesue.通常,您可能会认为队列是您突变的东西: queue.En
0 2024-04-14
编程技术问答社区
如何在c#中通过索引获得堆栈项目?
我是C#的新手. 是否可以像我们在c#? 中的列表中一样通过索引获取堆栈项目. 谢谢, 解决方案 您可以使用linq: 实现它 Stack stack = new Stack(); stack.Push(1); stack.Push(2); stack.Push(3); stack.Push(4); int top = stack.ElementAt(0); // Returns 4 int next = stack.ElementAt(1); // Returns 3 但是,如果您发现自己试图通过索引访问堆栈上的元素,那么您肯定会做错事,您应该重新设计解决方案. 其他解决方案 如Matias所示,可以使用ElementAt().您也可以使用PEEK查看最上面的东西而无需弹出.您也可以转换为一个数组并以这种方式获得索引值. var s = new Stack(); s.Push(1); s.Push(2); var va
0 2024-04-13
编程技术问答社区
我怎样才能从C#中循环使用USB设备?
我想在启动某个事件后循环(模拟拔出并重新插入)USB设备(调制解调器).我在CodeProject上找到了一个样本: http://www.codeproject.com/kb/systems/system/usbeignt.aspx.aspx 允许我通过其非易失性串行识别+弹出设备,但我需要它回收,而不仅仅是弹出. 我读过: httpp:html"> http:http:http://www.tech-archive.net/archive/development/microsoft.public.development.device.drives.drivers/2005-02/1292.html 我不明白. 在其他与USB相关的帖子中提到了这一点: /a> 这与我的问题无关. 解决方案 通过使用名为DEVCON的命令行工具使它起作用,然后我从代码中调用该工具. 将devcon.exe放入其中一种系统路径中,因此它到处都可
2 2024-04-13
编程技术问答社区
为什么我必须用非默认构造函数初始化我的C#结构中的所有字段?
我想尝试此代码: public struct Direction { private int _azimuth; public int Azimuth { get { return _azimuth; } set { _azimuth = value; } } public Direction(int azimuth) { Azimuth = azimuth } } 但是它在编译时失败了,我知道结构需要启动其所有字段. 但是我试图了解Clr \ Il Hoods下发生的情况. 为什么在任何其他方法\ property \ this等之前都需要所有字段. 谢谢. 解决方案 值类型是在堆栈上创建的(除非嵌套在参考类型中),堆栈上的字段/位置有些东西,CLR无法保证它们会被归零(与字段/位置相反在托管堆上保证将被归零).因此,必须在阅读之前将其写入.否则是一个安全漏洞.
0 2024-04-12
编程技术问答社区
在C#中检查堆栈大小
有没有办法检查c#? 中的线程大小 解决方案 这是也就是说,事实证明,有一种方法可以估算其余的堆栈空间.它并不精确,但对于评估您的底部有多近的目的而言,它足够有用.以下内容是基于 joe duffy . 我们知道(或将做出假设): 堆栈内存分配在连续的块中. 堆栈从上等地址到较低地址的"向下". 该系统需要在分配的堆栈空间底部附近的一些空间,以便优美地处理堆栈外例外.我们不知道确切的保留空间,但我们会尝试保守地束缚它. 有了这些假设,我们可以限制下面的代码通过调用递归功能并在字节中写出剩余的估计堆栈空间来证明这一点: : using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class P
0 2024-04-12
编程技术问答社区
为什么Stack<T>和Queue<T>是用数组实现的?
我在阿尔巴哈里兄弟的简而言之读了C#4.0,我遇到了这一点: 堆栈是用数组内部实现的,该数组根据需要调整大小,以及队列和列表. (第288页,第4段) 我不禁想知道为什么. LinkedList提供O(1)的头部和尾部插入物和删除(对于堆栈或队列应该很好).一个可解析的数组具有O(1)摊销插入(如果我不记得),但是O(n)最坏的情况(我不确定删除).而且它可能比链接列表使用的空间更多(对于大堆栈/队列). 还有更多吗?双链接列表实现的缺点是什么? 解决方案 但是o(n)最坏情况 摊销的最坏情况仍然是O(1).平均插入时间和短插入时间 - 这是摊销分析的全部点(对于删除而言相同). 一个数组也比链接列表使用 空间(毕竟必须为每个元素存储一个额外的指针). 此外,开销远低于链接列表.总而言之,对于几乎所有用例来说,基于数组的实现效率更高,即使访问偶尔会花费更长的时间(实际上,可以通过服用来实现队列效率更高本身在链接列表中管理的页面的优势 - 请
0 2024-04-12
编程技术问答社区
堆与栈分配的影响(.NET)。
来自 1 关于堆和堆栈,这给了我一个问题:为什么要知道变量分配的位置很重要? at 另一个答案有人指出堆栈是快点.这是唯一的含义吗?有人可以给出一个代码示例,其中简单的分配位置更改可以解决问题(例如绩效)? 请注意,这个问题是.NET特定 1从SO中删除问题. 解决方案 只要您知道语义是什么,堆栈与堆的唯一后果就是确保您不会溢出堆栈,并且知道与收集堆的垃圾相关的成本. 例如,JIT 可以注意,新创建的对象从未在当前方法之外使用(参考可以逃脱其他地方)并在堆栈上分配它.目前没有这样做,但这是合法的. 同样,C#编译器可以决定分配堆上的所有本地变量 - 堆栈只需包含对myMethodlocalacaliobles实例的引用,并且所有变量访问将通过此实现. (实际上,由代表或迭代块捕获的变量已经具有这种行为.) 其他解决方案 (编辑: 我的原始答案包含过度简化"结构是在堆栈上分配的",混乱的stack-vs-vs-heap和volate-vs-he
0 2024-04-11
编程技术问答社区