2009-01-30 13 views
116

चलें कहते हैं कि मैं इस सरणी है से एक तत्व नष्ट करने के लिए,कैसे सी # में एक सरणी

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

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

+0

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

+0

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

उत्तर

276

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

LINQ: (.नेट फ्रेमवर्क 3,5)

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

गैर -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(); 

तुम सिर्फ पहला उदाहरण निकालना चाहते हैं:

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

गैर 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(); 

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

4

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

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

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

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

आपका ArrayList "1" "के तार होते हैं: आप केवल पहले एक निकालना चाहते हैं, तो आप कुछ इस तरह करना होगा 3 "" 4 "" 9 "और" 2 "(रिक्त स्थान पर ध्यान दें)

तो इंडेक्सऑफ (4) कुछ भी नहीं मिलेगा क्योंकि 4 एक int है, और यहां तक ​​कि" tostring "इसे" 4 "में परिवर्तित कर देगा और नहीं "4", और कुछ भी हटा नहीं जाएगा।

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

+0

सूची ArrayList से बेहतर होगा। –

+0

यह उत्तर अधिक upvotes के लायक है। जबकि मैं पूरी तरह से @ माइकस्कॉट से सहमत हूं कि '' सूची ArrayList से बेहतर होगी, ऐसा लगता है कि ओपी के पास उस समस्या का सही ढंग से पता चलता है जब उसने अपनी मूल समस्या को हल करने के लिए ऐरेलिस्ट का उपयोग करने का प्रयास किया था। ओपी समझ गया कि आप सरणी का आकार बदल नहीं सकते हैं, जिसे किसी और ने ध्यान नहीं दिया है, और इसके बजाए एक आकार बदलने योग्य प्रकार का उपयोग करने की कोशिश की, जिसे किसी और ने देखा नहीं है, और फिर एक अलग समस्या से निकल गया, जो कोई और नहीं लगता ध्यान दिया है। – phoog

20

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

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

सरल और आसान। धन्यवाद! –

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

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

मैं अपने समाधान here तैनात।

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

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

आकार वास्तव में डेटा को एक नई सरणी में प्रतिलिपि बनाता है (जब तक कि पारित नया आकार पास सरणी की लंबाई न हो); यह पास सरणी उदाहरण के आकार को नहीं बदलता है। यही कारण है कि यह एक संदर्भ पैरामीटर है। Http://referencesource.microsoft.com/mscorlib/R/71074deaf111c4e3.html देखें। – phoog

संबंधित मुद्दे