[英]Remove an item from generic Array C#
我有一個這樣定義的通用類
class MyGenericClass<T> where T : ICompareable
{
T[] data;
public AddData(T[] values)
{
data = values;
}
}
在mainForm中,我創建3個隨機數,並將它們添加為值,例如1、2和3。 看起來像這樣:[0] 1 [1] 2 [2] 3
我想做的是從數組中刪除這些值之一,當我使用泛型時該如何做。 可以說我想從數組中刪除3,所以它看起來像這樣[0] 1 [1] 2
為什么不使用通用列表( List<T>
)而不是數組作為類的私有成員來保存數據?
由於它是私人成員,因此“外部世界”無法訪問該列表,並且由於列表使您可以輕松添加和刪除項目,因此您的生活會輕松得多。
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]);
}
}
}
完成此操作后,可以使用List
的Add
成員方法添加項目,並使用Remove
成員方法刪除項目。 就那么簡單。
我在AddData
方法中使用了params
關鍵字,因此您可以執行以下操作:
var x = new MyGenericClass<int>();
x.AddData(1);
x.AddData(2, 3, 4);
x.AddData(somIntegerList.ToArray());
我有點相同的問題,因為我正在編寫一個動態大小的數組來練習創建泛型類。
我發現您可以執行以下操作:向下移動所有元素,然后將最后一個元素設置為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;
}
更改您的類,使其看起來像這樣(我還實現了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);
}
}
如果對於某些原因,您堅持使用數組,則remove方法可能看起來像這樣
public RemoveData(T value)
{
data = data.Where( e => e.CompareTo(value) != 0).ToArray();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.