簡體   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