किसी तत्व को C # में सरणी से कैसे हटाया जाए


153

आइए बताते हैं कि मेरे पास यह सरणी है,

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

मैं "नाम" से किसी तत्व को कैसे हटा सकता हूं? , नंबर 4 कहते हैं?

यहां तक ​​कि ArrayListहटाने में मदद नहीं की?

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);
}

यदि आपकी सूची में डुप्लिकेट मान हैं तो क्या होगा? क्या आप पहले उदाहरण या सभी उदाहरणों को हटाना चाहते हैं?
बेनालास्टर

हां, मेरे पास डुप्लिकेट मान नहीं हैं, कोई विचार?
अहमद

अहमद क्या आपका मतलब है, नहीं, या आप नहीं करते हैं? (अपने अंग्रेजी का अपमान नहीं, सिर्फ स्पष्टीकरण के लिए पूछ रहे हैं)
मैल्फिस्ट

@Malfist - खेद :), मैं मतलब मैं दोहराया मूल्यों के बारे में परवाह नहीं है क्योंकि मुझे यकीन है कि वहाँ नहीं उनमें से किसी को मेरे मामले में, फिर से कर रहे हैं धन्यवाद
अहमद

3
आप C # में सरणियों से आइटम नहीं निकाल सकते, जैसा कि आप इस उदाहरण कार्यक्रम से देख सकते हैं । आप जो कुछ भी कर सकते हैं वह एक नया सरणी बना सकता है, केवल मूल एक के कुछ तत्वों की प्रतिलिपि बनाएँ और इसे मूल चर पर वापस असाइन करें। सभी उत्तरों में यही किया गया है।
निकोला मुसत्ती

जवाबों:


340

यदि आप सूचकांक को जानने की आवश्यकता के बिना 4 के सभी उदाहरणों को हटाना चाहते हैं:

LINQ: (.NET फ्रेमवर्क 3.5)

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

गैर-लाइनक्यू: (.NET फ्रेमवर्क 2.0)

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

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

यदि आप पहले उदाहरण को हटाना चाहते हैं:

LINQ: (.NET फ्रेमवर्क 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();

गैर-लाइनक्यू: (.NET फ्रेमवर्क 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();

संपादित करें: जैसा कि आपने पहले ही यह पता नहीं लगाया है, जैसा कि Malfist ने बताया है, आपको काम करने के लिए LINQ कोड उदाहरणों के लिए .NET फ्रेमवर्क 3.5 को लक्षित करने की आवश्यकता है। यदि आप 2.0 को लक्षित कर रहे हैं तो आपको गैर-लाइनक्यू उदाहरणों को संदर्भित करने की आवश्यकता है।



21

आप अपनी सरणी को सूची में भी बदल सकते हैं और सूची से कॉल हटा सकते हैं। फिर आप अपनी सरणी में वापस परिवर्तित कर सकते हैं।

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

11

प्रश्न में जो कोड लिखा गया है, उसमें एक बग है

आपकी सरणी सूची में "1" "3" "4" "9" और "2" के तार हैं (रिक्त स्थान पर ध्यान दें)

इसलिए IndexOf (4) को कुछ नहीं मिलेगा क्योंकि 4 एक int है, और यहां तक ​​कि "toring" इसे "4" में बदल देगा और "4" नहीं, और कुछ भी नहीं निकाला जाएगा।

एक सरणी सूची वह करने का सही तरीका है जो आप चाहते हैं।


सूची <T> ArrayList से बेहतर होगी।
माइक स्कॉट

1
यह उत्तर अधिक उत्थान के योग्य है। जबकि मैं पूरी तरह से @MikeScott से सहमत हूं जो List<T>ArrayList से बेहतर होगा, यह एकमात्र उत्तर प्रतीत होता है जो उस समस्या की सही पहचान करता है जो ओपी ने अपनी मूल समस्या को हल करने के लिए ArrayList का उपयोग करने की कोशिश की थी। ओपी समझ गया कि आप सरणियों का आकार नहीं बदल सकते हैं, जिसे किसी और ने नहीं देखा है, और इसके बजाय एक resizeable प्रकार का उपयोग करने की कोशिश की है, जो किसी और को नहीं लगता है, और फिर एक अलग समस्या से फंस गया, जो किसी और को नहीं लगता है ध्यान दिया है।
फोग

5

यदि आप तत्व के सभी उदाहरणों को हटाना चाहते हैं तो बालाबस्टर का उत्तर सही है। यदि आप केवल पहले एक को हटाना चाहते हैं, तो आप कुछ ऐसा करेंगे:

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

मैंने अपना समाधान यहां पोस्ट किया ।

यह एक सरणी तत्व को दूसरे सरणी में कॉपी किए बिना हटाने का एक तरीका है - बस उसी सरणी उदाहरण के फ्रेम में:

    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
आकार वास्तव में एक नए सरणी में डेटा को कॉपी करता है (जब तक कि नया आकार पारित सरणी की लंबाई नहीं है); यह पारित सरणी उदाहरण के आकार को नहीं बदलता है। इसलिए यह एक संदर्भ पैरामीटर है। देखें referencesource.microsoft.com/mscorlib/R/71074deaf111c4e3.html
फोग

5

एक सरणी से निकालना अपने आप में सरल नहीं है, क्योंकि आपको फिर आकार बदलने से निपटना होगा। इसके List<int>बजाय कुछ का उपयोग करने के महान लाभों में से एक है । यह 2.0 में Remove/ प्रदान करता है RemoveAt, और 3.0 के लिए बहुत सारे LINQ एक्सटेंशन।

यदि आप कर सकते हैं, तो रिफ्लेक्टर एक List<>या समान का उपयोग करने के लिए ।


मुझे लगता है कि यह इस मामले में सबसे अच्छा समाधान है।
बोगडान डाइसिन

3

एक सामान्य विस्तार के रूप में, 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();
    }
}

उपयोग:

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

0

' शब्दकोश प्रमुख मूल्यों के आधार पर स्ट्रिंग से आइटम निकालने के लिए। '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

आप इस तरह से कर सकते हैं:

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();        
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.