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);
}
ahmed
sumber
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.

BenAlabaster
sumber
32
int[] numbers = { 1, 3, 4, 9, 2 };
numbers = numbers.Except(new int[]{4}).ToArray();
meetjaydeep
sumber
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);
Dave DP
sumber
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.

DevinB
sumber
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();
}
Vojislav Stojkovic
sumber
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);
    }
infografnet
sumber
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.

ctacke
sumber
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);
Petrucio
sumber
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()
SP007
sumber
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();        

sumber