检查通用数组是否为空(默认)字段

时间:2016-01-02 07:00:06

标签: c# arrays generics

我有一个通用的Array2D类,想要添加一个isEmpty getter。但是,在这种情况下,T无法通过default(T)!=进行比较。并且Equals()无法使用,因为字段可能是null(但请参阅下面的代码)。我怎样才能检查所有字段是否为空(即引用类型或结构/等的默认值)?

到目前为止,我提出了以下解决方案,但对于我来说,对于简单的isEmpty检查来说,它似乎已经相当啰嗦,这可能不是解决此问题的最佳方法。有人知道更好的解决方案吗?

public sealed class Array2D<T>
{
    private T[,] _fields;
    private int _width;
    private int _height;

    public bool isEmpty
    {
        get
        {
            for (int x = 0; x < _width; x++)
            {
                for (int y = 0; y < _height; y++)
                {
                    if (_fields[x, y] != null && !_fields[x, y].Equals(default(T))) return false;
                }
            }
            return true;
        }
    }

    public Array2D(int width, int height)
    {
        _width = width < 0 ? 0 : width;
        _height = height < 0 ? 0 : height;
        _fields = new T[width, height];
    }
}

1 个答案:

答案 0 :(得分:2)

不是循环遍历IsEmpty中的所有元素,只需在设置值时更新IsEmpty的值(需要索引器,但无论如何你可能需要一个):

public class Array2<T>
{
    private readonly T[,] _array;
    private bool _isEmpty;

    public Array2(int width, int height)
    {
        _array = new T[width, height];
        _isEmpty = true;
    }

    public T this[int x, int y]
    {
        get { return _array[x, y]; }
        set
        {
            _array[x, y] = value;
            _isEmpty = _isEmpty && value.Equals(default(T));
        }
    }

    public bool IsEmpty
    {
        get { return _isEmpty; }
    }
}

示例:

Array2<int> array2 = new Array2<int>(10, 10);
array2[0, 0] = 0;
Console.WriteLine(array2.IsEmpty);
array2[0, 0] = 1;
Console.WriteLine(array2.IsEmpty);
array2[0, 0] = 0;
Console.WriteLine(array2.IsEmpty);

输出:

True
False
False

显然这是一种权衡,但想象一下,阵列中有100万个元素,你的循环运行100万次。使用这种方法,没有循环,只能随时检查2个条件。