我正在使用时间戳来临时命令我的程序中的并发更改,并要求更改的每个时间戳都是唯一的.但是,我发现简单地调用DateTime.Now是不够的,因为如果快速连续调用,它通常会返回相同的值.
我有一些想法,但没有任何事情让我觉得这是"最好的"解决方案.有没有一种方法可以保证每次连续调用都能产生一个独特的DateTime?
我应该为此使用不同的类型,也许是长整数?DateTime具有明显的优势,可以像实时一样轻松解释,不像增量计数器.
更新:这是我最终编写的一个简单的折衷解决方案,它仍然允许我DateTime用作我的临时密钥,同时在每次调用方法时确保唯一性:
private static long _lastTime; // records the 64-bit tick value of the last time
private static object _timeLock = new object();
internal static DateTime GetCurrentTime() {
lock ( _timeLock ) { // prevent concurrent access to ensure uniqueness
DateTime result = DateTime.UtcNow;
if ( result.Ticks <= _lastTime )
result = new DateTime( _lastTime + 1 );
_lastTime = result.Ticks;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
因为每个滴答值只有一千万分之一秒,所以这种方法在每秒调用1000万次时会引入明显的时钟偏差(顺便说一句,它的执行效率足够高),这意味着它是完全可以接受我的目的.
这是一些测试代码:
DateTime start …Run Code Online (Sandbox Code Playgroud) 我有一堆10位数的整数,我在URL中传递.类似于:"4294965286","2292964213".它们总是积极的,总是10位数.
我想将这些整数压缩成可以在URL中使用的最小可能形式(也就是字母和数字完全正常),然后在以后解压缩它们.我已经看过使用gzipstream,但它创建了更大的字符串,而不是更短.
我目前正在使用asp.net,所以vb.net或c#解决方案是最好的.
谢谢
我有一个类,内部只是一个整数数组.一旦构造,阵列永远不会改变.我想预先计算一个好的哈希码,以便这个类可以非常有效地用作词典中的键.数组的长度小于约30项,并且整数通常在-1000和1000之间.
我想将一个double值解析成一个string.我希望我的号码具有指定的位数(直到运行时才会知道).如果这个数字可以用数字的非零值表示,这就是我想要的.如果数字是这样的零,我希望用科学记数法表示.
一些例子会使这更清楚,这假设我想要3位数:
价值: .2367 输出: "0.23"
价值: .00367 输出: "3.67E-3"
价值: 22.3 输出: "22.3"
价值: 3364.0 输出: "3.36E3"
我的解决方案是使用ToString()方法和N 数字格式字符串,如果它导致零恢复到E格式字符串,但这感觉就像重新发明轮子.有谁知道一个内置的方法来做到这一点?
c# ×4
.net ×1
algorithm ×1
arrays ×1
asp.net ×1
compression ×1
concurrency ×1
datetime ×1
hashcode ×1
vb.net ×1