我想知道如何在不使用array.length方法的情况下找到数组的长度而不是array.length方法实现了什么?
我有一些功课来完成一些arbituary数组排序而不使用array.length方法我很好奇c#如何找到数组长度它是否通过数组计算每个非空值并返回一个值或是否有一个与数组长度相关联的特定内存值,可以更好地访问,然后其他任何事情我只是想知道长度方法的幕后发生了什么
您可以使用 theArray.GetLength(0) ,但它与使用 theArray.Length 基本相同,只是更详细...
theArray.GetLength(0)
theArray.Length
这将是一种方式:
int count = 0; foreach (var item in YourArray) { count++; }
count将保存数组中有多少项 .
编辑:当然我忘了如果你不能使用可怕的长度属性,你可以使用 Count() 方法 .
Count()
这是一个非常可怕的方式,但要涵盖所有理由,但我更强烈地劝阻这一点 .
int[] test = new int[10]; int count = 0; try { for (; ; ) { count++; test[count].ToString(); } } catch (IndexOutOfRangeException ex) { } Console.Write(count); Console.ReadKey();
在不使用 Array.Length 属性的情况下获取数组的长度几乎是不可能的 .
Array.Length
好吧,你可以:
使用枚举器(在 foreach 语句中或通过 LINQ )并计算它们给你的元素,但它只是一个间接 - ArrayEnumerator 显然在内部使用 Array.Length .
foreach
LINQ
ArrayEnumerator
使用不安全代码并获取长度,因为它存储在实际数据之前(实际第一个元素之前的4或8个字节) .
你甚至可以从托管堆中获取有关数组引用的一些信息并计算长度,但是如果有可能它将是一个hack,即使我们知道为数组分配的内存是100字节,我们也可以'确保使用了所有这些内存
PROPOSED SOLUTION:
但是可能意味着使用数组终止符,比如'\ 0'字符,C运行时用来终止它的字符串 .
要使用数组终止符,您只需选择一些值(通常是最大或最小)并将其用作数组终止符:
Int32[] data = new Int32[] {10, -5, 100, Int32.MinValue}; PrintDataWithoutLength(data, Int32.MinValue); PrintDataWithoutLength<T>(T[] data, T terminator) { for(Int32 i = 0; !data[i].Equals(terminator) ; i++) { Console.WriteLine(data[i]); } }
4 回答
您可以使用
theArray.GetLength(0)
,但它与使用theArray.Length
基本相同,只是更详细...这将是一种方式:
count将保存数组中有多少项 .
编辑:当然我忘了如果你不能使用可怕的长度属性,你可以使用
Count()
方法 .这是一个非常可怕的方式,但要涵盖所有理由,但我更强烈地劝阻这一点 .
在不使用
Array.Length
属性的情况下获取数组的长度几乎是不可能的 .好吧,你可以:
使用枚举器(在
foreach
语句中或通过LINQ
)并计算它们给你的元素,但它只是一个间接 -ArrayEnumerator
显然在内部使用Array.Length
.使用不安全代码并获取长度,因为它存储在实际数据之前(实际第一个元素之前的4或8个字节) .
你甚至可以从托管堆中获取有关数组引用的一些信息并计算长度,但是如果有可能它将是一个hack,即使我们知道为数组分配的内存是100字节,我们也可以'确保使用了所有这些内存
PROPOSED SOLUTION:
但是可能意味着使用数组终止符,比如'\ 0'字符,C运行时用来终止它的字符串 .
要使用数组终止符,您只需选择一些值(通常是最大或最小)并将其用作数组终止符: