我有一个像这样定义的泛型类
class MyGenericClass<T> where T : ICompareable
{
T[] data;
public AddData(T[] values)
{
data = values;
}
}
在mainForm中,我创建了3个随机数,并将它们作为值添加,比如说1,2和3.所以我的T []数据;将如下所示:[0] 1 [1] 2 [2] 3
我想要做的是从数组中删除其中一个值,当我使用泛型时如何做到这一点。假设我想从数组中删除3,所以它看起来像这[0] 1 [1] 2
答案 0 :(得分:11)
为什么不使用通用列表(List<T>
)而不是数组作为类的私有成员来保存数据?
由于它是私人会员,因此“外部世界”无法访问该列表,并且您将拥有更轻松的生活,因为List允许您轻松添加和删除项目。
class MyGenericClass<T> where T : ICompareable
{
private List<T> data = new List<T>();
public AddData(params T[] values)
{
data.AddRange (values);
}
public RemoveData( T value )
{
data.Remove (value);
}
public RemoveData( params T[] values )
{
for( int i = 0; i < values.Length; i++ )
{
data.Remove (values[i]);
}
}
}
完成此操作后,您可以使用Add
的{{1}}成员方法添加项目,使用List
成员方法删除项目。就那么简单。
我在Remove
方法中使用了params
关键字,以便您可以执行此操作:
AddData
答案 1 :(得分:0)
将您的类更改为这样(我还实现了Frederik建议使用List而不是数组。
class MyGenericClass<T> where T : ICompareable
{
List<T> data;
public AddData(T value)
{
data.Add(value);
}
public RemoveData(T value)
{
data.Remove(value);
}
}
如果对某些reasaon,你坚持使用数组,remove方法可能看起来像这样
public RemoveData(T value)
{
data = data.Where( e => e.CompareTo(value) != 0).ToArray();
}
答案 2 :(得分:0)
我有同样的问题,因为我正在编写一个动态大小的数组来练习创建泛型类。
我发现你可以:向下移动所有元素然后将最后一个元素设置为default(T)
,或者创建一个大小为1的新数组以填充其余元素。
例如:
public class Array<T>
{
private T[] _array { get; set; }
private int _max { get; set; }
private int _size { get; set; }
public Array()
{
_max = 10;
_array = new T[_max];
_size = 0;
}
public T Remove(int i)
{
if (i >= _size || i < 0) return default(T);
var tmp = _array[i];
for (var j = i; j < _size-1; ++j)
{
_array[j] = _array[j + 1];
}
_array[_size - 1] = default(T);
_size--;
return tmp;
}
}
Or...
public T Remove(int i) {
var tmp = new T[_size-1];
for(var j=0; j < i; ++j)
{
tmp[j] = _array[j];
}
var result = _array[i];
for(var j=i+1; j < _size-1; ++j)
{
tmp[j] = _array[j];
}
_array = null;
_array = tmp;
return result;
}