繁体   English   中英

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

[英]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]);
      }
  }
}

完成此操作后,可以使用ListAdd成员方法添加项目,并使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM