Remove element of a regular array

前端 未结 15 2232
野性不改
野性不改 2020-11-22 10:06

I have an array of Foo objects. How do I remove the second element of the array?

I need something similar to RemoveAt() but for a regular array.

相关标签:
15条回答
  • 2020-11-22 10:35

    Here's how I did it...

        public static ElementDefinitionImpl[] RemoveElementDefAt(
            ElementDefinition[] oldList,
            int removeIndex
        )
        {
            ElementDefinitionImpl[] newElementDefList = new ElementDefinitionImpl[ oldList.Length - 1 ];
    
            int offset = 0;
            for ( int index = 0; index < oldList.Length; index++ )
            {
                ElementDefinitionImpl elementDef = oldList[ index ] as ElementDefinitionImpl;
                if ( index == removeIndex )
                {
                    //  This is the one we want to remove, so we won't copy it.  But 
                    //  every subsequent elementDef will by shifted down by one.
                    offset = -1;
                }
                else
                {
                    newElementDefList[ index + offset ] = elementDef;
                }
            }
            return newElementDefList;
        }
    
    0 讨论(0)
  • 2020-11-22 10:35

    I know this article is ten years old and therefore probably dead, but here's what I'd try doing:

    Use the IEnumerable.Skip() method, found in System.Linq. It will skip the selected element from the array, and return another copy of the array that only contains everything except the selected object. Then just repeat that for every element you want removed and after that save it to a variable.

    For example, if we have an array named "Sample" (of type int[]) with 5 numbers. We want to remove the 2nd one, so trying "Sample.Skip(2);" should return the same array except without the 2nd number.

    0 讨论(0)
  • 2020-11-22 10:38

    Here is an old version I have that works on version 1.0 of the .NET framework and does not need generic types.

    public static Array RemoveAt(Array source, int index)
    {
        if (source == null)
            throw new ArgumentNullException("source");
    
        if (0 > index || index >= source.Length)
            throw new ArgumentOutOfRangeException("index", index, "index is outside the bounds of source array");
    
        Array dest = Array.CreateInstance(source.GetType().GetElementType(), source.Length - 1);
        Array.Copy(source, 0, dest, 0, index);
        Array.Copy(source, index + 1, dest, index, source.Length - index - 1);
    
        return dest;
    }
    

    This is used like this:

    class Program
    {
        static void Main(string[] args)
        {
            string[] x = new string[20];
            for (int i = 0; i < x.Length; i++)
                x[i] = (i+1).ToString();
    
            string[] y = (string[])MyArrayFunctions.RemoveAt(x, 3);
    
            for (int i = 0; i < y.Length; i++)
                Console.WriteLine(y[i]);
        }
    }
    
    0 讨论(0)
  • 2020-11-22 10:39

    LINQ one-line solution:

    myArray = myArray.Where((source, index) => index != 1).ToArray();
    

    The 1 in that example is the index of the element to remove -- in this example, per the original question, the 2nd element (with 1 being the second element in C# zero-based array indexing).

    A more complete example:

    string[] myArray = { "a", "b", "c", "d", "e" };
    int indexToRemove = 1;
    myArray = myArray.Where((source, index) => index != indexToRemove).ToArray();
    

    After running that snippet, the value of myArray will be { "a", "c", "d", "e" }.

    0 讨论(0)
  • 2020-11-22 10:46

    I use this method for removing an element from an object array. In my situation, my arrays are small in length. So if you have large arrays you may need another solution.

    private int[] RemoveIndices(int[] IndicesArray, int RemoveAt)
    {
        int[] newIndicesArray = new int[IndicesArray.Length - 1];
    
        int i = 0;
        int j = 0;
        while (i < IndicesArray.Length)
        {
            if (i != RemoveAt)
            {
                newIndicesArray[j] = IndicesArray[i];
                j++;
            }
    
            i++;
        }
    
        return newIndicesArray;
    }
    
    0 讨论(0)
  • 2020-11-22 10:46

    Not exactly the way to go about this, but if the situation is trivial and you value your time, you can try this for nullable types.

    Foos[index] = null
    

    and later check for null entries in your logic..

    0 讨论(0)
提交回复
热议问题