2

假设我有字节数组

byte[] arr = new byte[16];

我只填充了这 16 个字节中的 10 个

arr[0] = 1;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
arr[5] = 5;
arr[6] = 6;
arr[7] = 7;
arr[8] = 8;
arr[9] = 9;
arr[10] = 1;

问题是用户最多可以输入10位数字,最后一位数字可能是0

我怎样才能找到我的数组包含多少位数,因为 arr.Length 和 arr.Count() 将给出 16,但我需要知道它是 10?

4

3 回答 3

7

我认为您最好使用通用List。然后您可以使用该Count属性来获取正确数量的项目。

List<byte> arr = new List<byte>();

arr.Add(1);
arr.Add(2);
arr.Add(3);
arr.Add(4);
arr.Add(5);

int count = arr.Count; // returns 5;
byte[] myArray = arr.ToArray(); // returns byte array

更新

如果数组是您唯一的选择并且您无法切换到数组,那么您就不List<T>走运了。问题是,默认情况下,C# 会将数组中的每个字节初始化为0. 因此,一旦编译器开始new byte[16];初始化,整个字节数组就会被 0 填充。一旦发生这种情况,就无法知道 0 是默认值还是有效值。如果在 0 到 255 之间有一个您 100% 知道不会被使用的数字,您可以使用该数字初始化数组并获取每个元素的计数 != 到该数字。

您可以做的另一件事是您可以将数组初始化为一个字节(例如new byte[1]),并且每次需要更多元素时,将数组的大小调整为一个额外的字节。然后你可以使用标准Length属性来查看填充了多少。

于 2013-04-11T15:31:43.580 回答
2

好吧,如果"0"意味着该项目未填写(这意味着您不能0用作有效条目),您可以使用:

int numFilled = arr.Count(b => b != 0);

否则,您将不得不使用“神奇”数字(例如255)来表示“未使用”项目。

无论哪种方式,它都不是万无一失的。如果没有理由使用固定长度的数组,那么我建议使用不同的结构,例如List<byte>可以动态填充并轻松转换为数组的结构。

于 2013-04-11T15:29:06.023 回答
1
int count = arr.Where(item => item != 0).Count();

或者

int count = arr.Count(item => item != 0);

[编辑] 正如 Jon Skeet 上面所说,这假设您没有用 0 填充任何条目。

于 2013-04-11T15:28:55.100 回答