【发布时间】:2016-06-30 23:52:18
【问题描述】:
这只是为了解决一个好奇心 - 假设在我的 C# 项目中,我有一个包含数百万个字符串的列表,每个字符串如下所示:
"123Hi1234Howdy"
"Hi1Howdy23"
....
我需要知道的是,对于字符串中的每个字符,它是数字还是字母。
所以,我在想最简单的存储方法是 0 和 1 或 True / False。因此,在上面的示例中,假设我可以分配IsLetter = 1 和IsDigit = 0,我可以将每一行转换为:
"123Hi1234Howdy" >> 00011000011111
"Hi1Howdy23" >> 1101111100
....
在我看来是存储我正在寻找的数据的最有效方式(但如果我在这方面有误,请务必纠正我 - 我仍然非常编程新手)。
因此,编写循环遍历一行并检查每个字符是数字还是字母并将其转换为真/假或 1/0 的代码就足够简单了。我的问题是存储每行输出的最佳方式是什么?
我应该将每一行的输出存储为位数组吗?它是否可以存储为其他类型(例如整数),然后可以转换回一系列位?它应该存储为布尔数组吗? 关于存储它的最佳方式还有其他想法吗?当一切都说完了,我需要一个我可以知道的列表,例如:
myList[0] = 00011000011111
myList[1] = 1101111100
然后,因此,myList[0] <> myList[1]
【问题讨论】:
-
你应该在你的场景中添加什么/为什么构成“最佳”的描述
-
为什么需要知道给定字符是字母还是数字?根据您需要该信息的目的,您可以进一步压缩内容。请注意,操作位数组不一定很快——最小的表示并不意味着最快的算法。
-
根据字符串长度,您可以转换为数字并存储它,但它仅适用于 64 个字符以下的字符串。
-
是的,正如 CaffGeek 所说,如果字符串长度小于 64 个字符,您可以使用整数或长整数数组,并使用按位运算打开/关闭您需要的位。否则,我会使用 BitArray 的数组
-
我仍然认为需要更多信息,即您将如何使用存储的表示?您是要减小存储地图的大小还是要针对某些内容进行优化,如果是这样,那又是什么?
标签: c# performance storage bitarray