我正在学习泛型,所以我正在尝试创建自己的泛型数组类,我可以使用它来创建字符串数组或数组数据数组。这个泛型类有一些不同的方法,例如,我可以添加数据和删除数据,以及搜索数据。所有这些方法都像数字数据的魅力一样,但我在使用字符串时遇到了一些问题,因为它是一个引用类型,默认值为null,这使得我的方法抛出了空异常。
My Class看起来像这样:
class MyArray<T> : IComparable<T>, IEnumerable<T>, IEnumerator<T>
{
T[] data = new T[10];
private int currentIndex = 0;
//This method works as intended, both with strings and ints
public void Add(T Value)
{
data[currentIndex] = Value;
currentIndex++;
if (currentIndex == data.Length)
{
T[] tmp = new T[data.Length + 10];
data.CopyTo(tmp, 0);
data = tmp;
}
}
//Can't figure out how to make this method work with strings
public void RemoveItem(T Value)
{
T[] tmp = new T[data.Length - 1];
int i = 0;
foreach (T ele in data)
{
if (!ele.Equals(Value))//This line gives me a nullRefException when I'm using strings
{
tmp[i] = ele;
i++;
}
}
data = tmp;
}
我的主要表单,我正在添加数据并尝试删除它,如下所示:
static void Main(string[] args)
{
MyArray<string> StringArray = new MyArray<string>();
StringArray.Add("1");
StringArray.Add("2");
StringArray.RemoveItem("2");
}
由于默认值为null,我无法找到一种巧妙的方法来删除数据,因为它是一个字符串。
提前致谢:)
答案 0 :(得分:2)
而不是ele.Equals(Value)
,请使用EqualityComparer<T>.Default.Equals(ele, Value)
;这将适用于null
(对于引用类型),Nullable<T>
(对于值类型),实现IEquatable<T>
的类型以及使用object.Equals
的任何其他类型。< / p>
你可能想要缓存它,但是:
var comparer = EqualityComparer<T>.Default;
//loop
if(comparer.Equals(ele,Value)) {...}