我有一个通用的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];
}
}
答案 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个条件。