相关疑难解决方法(0)

如何确保时间戳始终是唯一的?

我正在使用时间戳来临时命令我的程序中的并发更改,并要求更改的每个时间戳都是唯一的.但是,我发现简单地调用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)

.net c# concurrency datetime

30
推荐指数
3
解决办法
2万
查看次数

将大整数压缩为最小的可能字符串

我有一堆10位数的整数,我在URL中传递.类似于:"4294965286","2292964213".它们总是积极的,总是10位数.

我想将这些整数压缩成可以在URL中使用的最小可能形式(也就是字母和数字完全正常),然后在以后解压缩它们.我已经看过使用gzipstream,但它创建了更大的字符串,而不是更短.

我目前正在使用asp.net,所以vb.net或c#解决方案是最好的.

谢谢

c# vb.net compression asp.net

18
推荐指数
3
解决办法
2万
查看次数

整数数组的C#哈希码

我有一个类,内部只是一个整数数组.一旦构造,阵列永远不会改变.我想预先计算一个好的哈希码,以便这个类可以非常有效地用作词典中的键.数组的长度小于约30项,并且整数通常在-1000和1000之间.

c# arrays algorithm hashcode

16
推荐指数
2
解决办法
2万
查看次数

仅在需要时使用科学记数法

我想将一个double值解析成一个string.我希望我的号码具有指定的位数(直到运行时才会知道).如果这个数字可以用数字的非零值表示,这就是我想要的.如果数字是这样的零,我希望用科学记数法表示.

一些例子会使这更清楚,这假设我想要3位数:

价值: .2367 输出: "0.23"

价值: .00367 输出: "3.67E-3"

价值: 22.3 输出: "22.3"

价值: 3364.0 输出: "3.36E3"

我的解决方案是使用ToString()方法和N 数字格式字符串,如果它导致零恢复到E格式字符串,但这感觉就像重新发明轮子.有谁知道一个内置的方法来做到这一点?

c# string-formatting number-formatting

5
推荐指数
1
解决办法
1万
查看次数