【问题标题】:Best way to store multiple lists of true false values存储多个真假值列表的最佳方法
【发布时间】:2016-06-30 23:52:18
【问题描述】:

这只是为了解决一个好奇心 - 假设在我的 C# 项目中,我有一个包含数百万个字符串的列表,每个字符串如下所示:

"123Hi1234Howdy"
"Hi1Howdy23"
....

我需要知道的是,对于字符串中的每个字符,它是数字还是字母。

所以,我在想最简单的存储方法是 0 和 1 或 True / False。因此,在上面的示例中,假设我可以分配IsLetter = 1IsDigit = 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


【解决方案1】:

您可以为每个单词使用BitArray,并将位设置为真或假,无论它们是否为数字。查看这个可能的解决方案:

void Main()
{
    string[] words = 
    {
        "123Hi1234Howdy", 
        "Hi1Howdy23"
    };

    //Create an array of BitArray
    var bArrays = words.Select(w => new BitArray(w.Select(c => char.IsDigit(c)).ToArray()));

    //You can also create string too
    var strings = words.Select(w => new string(w.Select(c => char.IsDigit(c) ? '1' : '0').ToArray())).ToArray();


}

这不一定是最快或最有效的。我想这取决于你打算对字符串做什么,但至少它很简单!

【讨论】:

  • 非常感谢,克里斯! - 我得到的问题没有很好地说明,但是,鉴于您的解决方案(非常干净和简单),我最终得到了一个 BitArray 数组......也很容易使用!
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2016-04-14
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多