如何判断int []是否还没有分配任何内容呢?

时间:2012-04-27 18:56:42

标签: c# arrays null arraylist

如果我有这个:

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

...我想退出一个方法,如果它没有分配给它的值,我该如何测试呢?是吗:

if (lstAFewInts[0] == null)

...或???

7 个答案:

答案 0 :(得分:8)

我的建议:提高抽象级别。

class LazyArray<T>
{
    private T[] array;
    private int size;
    public LazyArray(int size) { this.size = size; }
    public bool IsInitialized { get { return this.array != null; } }
    public T this[int x] 
    { 
        get 
        { 
            return this.array == null ? default(T) : this.array[x];
        }
        set
        {
            if (this.array == null) this.array = new T[size];
            this.array[x] = value;
        }
    }
}

你已经完成了:你有一个任意大小的数组,你知道它是否已被使用:

void M()
{
    var myArray = new LazyArray<int>(whatever);
    while(whatever)
    {
        if (whatever) myArray[whatever] = whatever;
    }
    if (myArray.IsInitialized) 
        whatever;
}

答案 1 :(得分:7)

default(T)  // i.e., default(int)

将为您提供给定类型的默认值(在您的情况下为int)。但是,由于int是值类型,因此无法区分默认值0和指定值0。

你确定你能以最好的方式做到这一点吗?像Dictionary<something, int>这样的东西可以让你更好地了解是否已经分配了某些内容,因为如果没有密钥就不会存在。这当然假设您有唯一的密钥可供使用,但从常量的名称判断,星号的名称可能是一个很好用的密钥。

也...

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

我们银河系中的恒星数量估计约为1000亿颗。这是你分配的大约400GB。我发现你在不久的将来会耗尽内存:)

答案 2 :(得分:3)

如果您不能依赖值0来指定空元素,并且您可以更改现有定义,则可以使用可为空的整数数组 - int?[]

int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

现在所有值都为null,直到分配了一个数字 - 任意数字:

bool atLeastOneAssigned = lstAFewInts.Any(i => i.HasValue);

答案 3 :(得分:1)

数组初始化为默认类型。由于int是一个值类型,这意味着它被初始化为int的默认值,即0。无法知道这是由某人指定的还是它的初始值。

答案 4 :(得分:1)

if (lstAFewInts.All(i => i == 0))
{
    // No value, except possibly 0, has been assigned.  
}

答案 5 :(得分:0)

您可以使用可以为空的int。

int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

然后

lstAFewInts[0].HasValue; // false

当然,如果您有一个循环,您可以检查每个索引以查看它是否已分配给。

答案 6 :(得分:0)

对于它们的类型,数组将被初始化为null,但是没有像NULL这样的东西!所以我认为所有的值都会被初始化为0。您可以检查第一个值是否为0,但这不是理想的,因为0可能是您想要使用的。

如果可能的话,我会重新考虑它并声明数组(在初始化为任何大小之前它将为NULL)并且只有在为其添加值时才初始化。然后你可以检查:

if (lstAFewInts)

返回NULL;