从通用数组C#中删除项目

时间:2011-02-28 11:54:56

标签: c# arrays

我有一个像这样定义的泛型类

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

3 个答案:

答案 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;
}