假设我有字节数组
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?
答案 0 :(得分: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]
),并且每次需要更多元素时,resize the array都需要一个额外的字节。然后,您可以使用标准Length
属性来查看填充的数量。
答案 1 :(得分:2)
如果"0"
表示项目未填写(这意味着您无法使用0
作为有效条目),那么您可以使用:
int numFilled = arr.Count(b => b != 0);
否则,您将不得不使用“魔术”号码(例如255
)来表示“未使用”的项目。
无论哪种方式,它都不是万无一失的。如果没有理由使用固定长度数组,那么我建议使用不同的结构,例如List<byte>
,可以动态填充转换到数组。
答案 2 :(得分:1)
int count = arr.Where(item => item != 0).Count();
或者
int count = arr.Count(item => item != 0);
[编辑]正如Jon Skeet上面所说,这假设您没有用0填充任何条目。