Cara menghapus elemen dari array di C #


153

Katakanlah saya punya array ini,

int[] numbers = {1, 3, 4, 9, 2};

Bagaimana saya bisa menghapus elemen dengan "nama"? , katakanlah nomor 4?

Bahkan ArrayListtidak membantu menghapus?

string strNumbers = " 1, 3, 4, 9, 2";
ArrayList numbers = new ArrayList(strNumbers.Split(new char[] { ',' }));
numbers.RemoveAt(numbers.IndexOf(4));
foreach (var n in numbers)
{
    Response.Write(n);
}

Bagaimana jika Anda memiliki nilai duplikat dalam daftar Anda? Apakah Anda hanya ingin menghapus instance pertama atau semua instance?
BenAlabaster

ya, saya tidak punya nilai duplikat, tahu?
ahmed

ahmed Maksud Anda, Tidak, tidak, atau ya, ya? (Tidak menghina bahasa Inggris Anda, hanya meminta klarifikasi)
Malfist

@Malfist - maaf :), maksud saya saya tidak peduli tentang nilai duplikat karena saya yakin tidak ada satupun dari mereka dalam kasus saya, terima kasih lagi
ahmed

3
Anda tidak dapat menghapus item dari array di C #, seperti yang Anda lihat dari program contoh ini . Yang bisa Anda lakukan adalah membuat array baru, menyalin hanya beberapa elemen dari yang asli dan menetapkannya kembali ke variabel asli. Inilah yang dilakukan dalam semua jawaban.
Nicola Musatti

Jawaban:


340

Jika Anda ingin menghapus semua instance 4 tanpa perlu tahu indeksnya:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2 };
int numToRemove = 4;
numbers = numbers.Where(val => val != numToRemove).ToArray();

Non-LINQ: (.NET Framework 2.0)

static bool isNotFour(int n)
{
    return n != 4;
}

int[] numbers = { 1, 3, 4, 9, 2 };
numbers = Array.FindAll(numbers, isNotFour).ToArray();

Jika Anda ingin menghapus hanya contoh pertama:

LINQ: (.NET Framework 3.5)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIndex = Array.IndexOf(numbers, numToRemove);
numbers = numbers.Where((val, idx) => idx != numIndex).ToArray();

Non-LINQ: (.NET Framework 2.0)

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int numIdx = Array.IndexOf(numbers, numToRemove);
List<int> tmp = new List<int>(numbers);
tmp.RemoveAt(numIdx);
numbers = tmp.ToArray();

Sunting: Jika Anda belum menemukan jawabannya, seperti yang ditunjukkan Malfist, Anda harus menargetkan .NET Framework 3.5 agar contoh kode LINQ berfungsi. Jika Anda menargetkan 2.0, Anda perlu merujuk contoh-contoh Non-LINQ.


32
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();

21

Anda juga dapat mengubah array Anda menjadi daftar dan memanggil penghapusan pada daftar. Anda kemudian dapat mengonversi kembali ke array Anda.

int[] numbers = {1, 3, 4, 9, 2};
var numbersList = numbers.ToList();
numbersList.Remove(4);

11

Kode yang ditulis dalam pertanyaan memiliki bug di dalamnya

Daftar array Anda mengandung string "1" "3" "4" "9" dan "2" (perhatikan spasi)

Jadi IndexOf (4) tidak akan menemukan apa pun karena 4 adalah int, dan bahkan "tostring" akan mengubahnya menjadi dari "4" dan bukan "4", dan tidak ada yang akan dihapus.

Arraylist adalah cara yang benar untuk melakukan apa yang Anda inginkan.


Daftar <T> akan lebih baik daripada ArrayList.
Mike Scott

1
Jawaban ini layak mendapat lebih banyak upvotes. Walaupun saya benar-benar setuju dengan @MikeScott yang List<T>akan lebih baik daripada ArrayList, ini tampaknya menjadi satu-satunya jawaban yang mengidentifikasi dengan benar masalah yang dimiliki OP ketika ia mencoba menggunakan ArrayList untuk menyelesaikan masalah aslinya. OP memahami bahwa Anda tidak dapat mengubah ukuran array, yang tampaknya tidak diketahui orang lain, dan mencoba menggunakan tipe yang dapat diubah ukurannya, yang tampaknya tidak diketahui orang lain, dan kemudian tersandung oleh masalah yang berbeda, yang tampaknya tidak terlihat oleh orang lain. telah memperhatikan.
phoog

5

Jawaban Balabaster benar jika Anda ingin menghapus semua instance elemen. Jika Anda ingin menghapus hanya yang pertama, Anda akan melakukan sesuatu seperti ini:

int[] numbers = { 1, 3, 4, 9, 2, 4 };
int numToRemove = 4;
int firstFoundIndex = Array.IndexOf(numbers, numToRemove);
if (numbers >= 0)
{
    numbers = numbers.Take(firstFoundIndex).Concat(numbers.Skip(firstFoundIndex + 1)).ToArray();
}

5

Saya memposting solusi saya di sini .

Ini adalah cara untuk menghapus elemen array tanpa menyalin ke array lain - hanya dalam bingkai contoh array yang sama:

    public static void RemoveAt<T>(ref T[] arr, int index)
    {
        for (int a = index; a < arr.Length - 1; a++)
        {
            // moving elements downwards, to fill the gap at [index]
            arr[a] = arr[a + 1];
        }
        // finally, let's decrement Array's size by one
        Array.Resize(ref arr, arr.Length - 1);
    }

4
Ubah ukuran sebenarnya menyalin data ke array baru (kecuali ukuran baru yang dikirimkan adalah panjang array yang dikirimkan); itu tidak mengubah ukuran instance array yang diteruskan. Karena itulah parameter referensi. Lihat Referenceource.microsoft.com/mscorlib/R/71074deaf111c4e3.html .
phoog

5

Menghapus dari sebuah array itu sendiri tidak mudah, karena Anda harus berurusan dengan mengubah ukuran. Ini adalah salah satu keuntungan besar menggunakan sesuatu seperti List<int>gantinya. Ini menyediakan Remove/ RemoveAtdalam 2.0, dan banyak ekstensi LINQ untuk 3.0.

Jika Anda bisa, refactor untuk menggunakan List<>atau serupa.


Saya pikir itu solusi terbaik dalam hal ini.
Bogdan Doicin

3

Sebagai ekstensi generik, kompatibel dengan 2,0:

using System.Collections.Generic;
public static class Extensions {
    //=========================================================================
    // Removes all instances of [itemToRemove] from array [original]
    // Returns the new array, without modifying [original] directly
    // .Net2.0-compatible
    public static T[] RemoveFromArray<T> (this T[] original, T itemToRemove) {  
        int numIdx = System.Array.IndexOf(original, itemToRemove);
        if (numIdx == -1) return original;
        List<T> tmp = new List<T>(original);
        tmp.RemoveAt(numIdx);
        return tmp.ToArray();
    }
}

Pemakaian:

int[] numbers = {1, 3, 4, 9, 2};
numbers = numbers.RemoveFromArray(4);

0

' Untuk menghapus item dari string berdasarkan nilai kunci Kamus. 'Kode VB.net

 Dim stringArr As String() = "file1,file2,file3,file4,file5,file6".Split(","c)
 Dim test As Dictionary(Of String, String) = New Dictionary(Of String, String)
 test.Add("file3", "description")
 test.Add("file5", "description")
 stringArr = stringArr.Except(test.Keys).ToArray()

0

Anda bisa melakukannya dengan cara ini:

int[] numbers= {1,3,4,9,2};     
List<int> lst_numbers = new List<int>(numbers);
int required_number = 4;
int i = 0;
foreach (int number in lst_numbers)
{              
    if(number == required_number)
    {
        break;
    }
    i++;
}
lst_numbers.RemoveAt(i);
numbers = lst_numbers.ToArray();        
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.