与十六进制中从 0 到 F 的计数方式类似,我有一个数字和字母数组,我想从中“计数”......当我达到最大值时,我想从头开始“十”列。
我需要它来提高 Azure 表中的存储效率,并保持我的主键很小(这样我就可以在tinyURL 中使用它们)。首先考虑只允许这些字符作为 propertyName,如文档 here 所示。 。在下面的数组中,每个字符根据 Azure 的排序方式进行定位。
public static string[] AzureChars = new string[]
{
"0","1","2","3","4","5","6","7","8","9","A",
"B","C","D","E","F","G","H","I",
"J","K","L","M","N","O","P","Q",
"R","S","T","U","V","W","X","Y",
"Z","a","b","c","d","e","f","g",
"h","i","j","k","l","m","n","o",
"p","q","r","s","t","u","v","w",
"x","y","z"
};
我的目标是使用 2 个字符串/ASCII 字符从字符串“00”计数到小写“zz”。
使用 C# 实现这一概念的最佳方法是什么?
-- 数组是正确使用的对象吗?
-- 如何将给定字符(大写“Y”)与其在数组中的位置关联起来?
我只是在尝试这个想法。乍一看,这似乎是一个不错的选择,但我还没有看到有人考虑这样做。你觉得怎么样?
最佳答案
您的问题实际上是关于将数字转换为两位数的 62 基数。以下是将正数转换为任意基数的通用代码片段:
var n = 1234;
var baseNumber = 62;
var numberOfDigits = 2;
var digits = new Int32[numberOfDigits];
for (var i = 0; i < digits.Length; i += 1) {
digits[i] = n%baseNumber;
n /= baseNumber;
}
您必须将数字映射为字符,并且查找表或一个小函数适合执行此操作。
对于具有可变位数的附加功能的具体问题,我会编写以下代码:
var n = 123456;
var digitCount = 3;
var digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var number = String.Empty;
for (var i = 0; i < digitCount; ++i) {
number = digits[n%digits.Length] + number;
n /= digits.Length;
}
请注意,此代码会将 0
转换为 000
,将 1
转换为 001
等,但我认为其实就是你想要的。
要转换回来,您可以使用以下代码:
var n = 0;
for (var i = 0; i < number.Length; ++i)
n = n*digits.Length + digits.IndexOf(number[i]);
String.IndexOf()
不是进行转换的最有效方法,但在大多数情况下应该没问题。
请注意,如果您的原始数字大于可存储在 62 基数中的最大数字,则转换回来将产生不同的数字。对于 62 进制的 3 位数字,如果原始数字大于或等于 zzz = 62^3 - 1 = 238327
,则为 true。
关于c# - 如何将数字与自定义 2char BaseX 相互转换? (又名 : How to do Azure Table property compression),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740865/