সি # তে অ্যারে থেকে কোনও উপাদান কীভাবে মুছবেন?


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

যদি আপনার তালিকায় সদৃশ মান থাকে? আপনি কি কেবল প্রথম উদাহরণটি বা সমস্ত দৃষ্টান্ত মুছে ফেলতে চান?
বেনএলাবাস্টার

হ্যাঁ, আমার নকল মান নেই, কোনও ধারণা?
আহমেদ

আহ্মেদ মানে কি, না আপনি করেন না, বা হ্যাঁ আপনি করেন? (আপনার
ইংরাজিকে

@ ম্যালফিস্ট - দুঃখিত :), আমার অর্থ হ'ল আমি সদৃশ মানগুলির বিষয়ে চিন্তা করি না কারণ আমি নিশ্চিত যে আমার ক্ষেত্রে সেগুলির কোনওটি নেই, আবারও ধন্যবাদ
আহমদ

3
আপনি সি # তে অ্যারে থেকে আইটেমগুলি সরাতে পারবেন না, যেমন আপনি এই উদাহরণস্বরূপ প্রোগ্রামটি থেকে দেখতে পারেন । আপনি যা করতে পারেন তা হল একটি নতুন অ্যারে তৈরি করা, কেবল আসলটির কয়েকটি উপাদানকে অনুলিপি করুন এবং এটিকে আবার আসল ভেরিয়েবলে বরাদ্দ করুন। সমস্ত উত্তরে এটি করা হয়।
নিকোলা মুসাত্তি

উত্তর:


340

আপনি যদি সূচকটি না জেনে 4 এর সমস্ত দৃষ্টান্ত মুছে ফেলতে চান:

লিনকিউ: (। নেট ফ্রেমওয়ার্ক 3.5)

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

অ-লাইনকিউ: (। নেট ফ্রেমওয়ার্ক ২.০)

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

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

আপনি যদি কেবল প্রথম উদাহরণটি সরাতে চান:

লিনকিউ: (। নেট ফ্রেমওয়ার্ক 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();

অ-লাইনকিউ: (। নেট ফ্রেমওয়ার্ক ২.০)

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

সম্পাদনা করুন: ম্যালফিস্ট যেমন উল্লেখ করেছেন, আপনি যদি ইতিমধ্যে এটি আবিষ্কার না করে থাকেন তবে আপনাকে লাইনকিউ কোডের উদাহরণগুলি কাজ করার জন্য .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" এর স্ট্রিং রয়েছে (স্পেসগুলি নোট করুন)

সুতরাং সূচিপত্র (4) কিছুই খুঁজে পাবে না কারণ 4 একটি ইনট, এবং "টস্ট্রিং" এটিকে "4" হিসাবে রূপান্তর করবে এবং "4" নয় এবং কিছুই সরানো হবে না।

একটি অ্যারেলিস্ট হ'ল যা চান তা করার সঠিক উপায়।


তালিকা <T> অ্যারেলিস্টের চেয়ে ভাল হবে।
মাইক স্কট 21

1
এই উত্তরটি আরও উন্নয়নের দাবিদার। যদিও আমি @ মাইকস্কোটের সাথে একেবারেই একমত, যা অ্যারেলিস্টের List<T>চেয়ে ভাল হবে, এটিই কেবলমাত্র উত্তর বলে মনে হয় যে ওপি যখন তার মূল সমস্যাটি সমাধান করার জন্য অ্যারেলিস্ট ব্যবহার করার চেষ্টা করেছিল তখন সেই সমস্যাটি সঠিকভাবে চিহ্নিত করে। ওপি বুঝতে পেরেছিল যে আপনি অ্যারেগুলিকে পুনরায় আকার দিতে পারবেন না, যা অন্য কারও নজরে আসেনি বলে মনে হয়েছে এবং পরিবর্তে পুনরায় আকার পরিবর্তনযোগ্য প্রকারটি ব্যবহার করার চেষ্টা করেছিলেন যা অন্য কারও নজরে আসেনি বলে মনে হয় এবং তারপরে একটি অন্যরকম সমস্যার দ্বারা বিভক্ত হয়ে যায়, যা অন্য কারও মনে হয় না seems খেয়াল আছে।
ফুগ

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
আকার পরিবর্তন আসলে তথ্যকে একটি নতুন অ্যারে অনুলিপি করে (যদি না পাসকৃত নতুন আকারটি পাস হওয়া অ্যারের দৈর্ঘ্য না হয়); এটি পাস হওয়া অ্যারের উদাহরণটির আকার পরিবর্তন করে না। এ কারণেই এটি একটি রেফারেন্স প্যারামিটার। রেফারেন্সসোর্স.মাইক্রোসফট . / মেসক্র্লিব / আর / 7১০74ddf111c4e3.html দেখুন ।
ফুগ

5

আরে থেকে নিজেকে সরিয়ে ফেলা সহজ নয়, কারণ আপনাকে আবার আকার পরিবর্তন করতে হবে। List<int>পরিবর্তে এর মতো কিছু ব্যবহার করার এটি একটি দুর্দান্ত সুবিধা । এটি 2.0 Remove/ RemoveAtএ প্রদান করে এবং 3.0 এর জন্য প্রচুর লিনকিউ এক্সটেনশন সরবরাহ করে।

আপনি যা করতে পারেন, তাহলে refactor ব্যবহার করতে 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

' অভিধান কী মানগুলির ভিত্তিতে স্ট্রিং থেকে আইটেমগুলি সরিয়ে ফেলতে। 'ভিবি নেট কোড

 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();        
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.