আমরা জাগে অ্যারে এবং বহুমাত্রিক অ্যারে উভয়ই কেন?


89
  1. ঝাঁকুনিযুক্ত অ্যারে এবং বহুমাত্রিক অ্যারের মধ্যে পার্থক্য কী। একে অপরের লাভ কি?

  2. এবং কেন ভিজুয়াল স্টুডিও আমাকে একটি করার অনুমতি দেয় না

    MyClass[][] abc = new MyClass[10][20];
    

    (আমরা এটি সি ++ তে করতাম, তবে সি # তে এটি লাল কুঁচকানো লাইনের সাথে [20] কে আন্ডারলাইন করে .. অবৈধ র‌্যাঙ্ক নির্দিষ্টকারী বলে)

    তবে এতে খুশি

    MyClass[,] abc = new MyClass[10,20];
    
  3. অবশেষে আমি কীভাবে এটি একটি একক লাইনে সূচনা করতে পারি (যেমন আমরা সহজ অ্যারে দিয়ে করি {new xxx...}{new xxx....})

    MyClass[][,][,] itemscollection;
    

11
ঝাঁকুনিযুক্ত অ্যারের পুরো বিন্দুটি হ'ল "নেস্টেড" অ্যারেগুলি অভিন্ন আকারের হওয়া উচিত নয়।
আনি

4
msdn.mic Microsoft.com/en-us/library/2yd9wwz4(v=vs.71).aspx - [এক্স, ওয়াই] হিসাবে বহুমাত্রিক অ্যারে সিনট্যাক্স ডক্স অনুসারে বৈধ
ndtreviv

অতিরিক্ত উপ-প্রশ্ন: বহুমাত্রিক অ্যারে সহ ফোরচ () ব্যবহার করা কি সম্ভব?
সার্জ ওয়াটিয়ার

@Serge - অবশ্যই, যেমন Arrayকার্যকরী IEnumerable। আপনি সর্বদা এটি চেষ্টা করতে পারেন এবং নিজের জন্য দেখতে পারেন :)
থিওপ

উত্তর:


107
  1. ঝাঁকুনিযুক্ত অ্যারে হ'ল একটি অ্যারে, সুতরাং int[][]একটি অ্যারের একটি অ্যারে int[], যার প্রতিটি পৃথক দৈর্ঘ্যের হতে পারে এবং মেমরিতে তাদের নিজস্ব ব্লক দখল করতে পারে। একটি বহুমাত্রিক অ্যারে ( int[,]) মেমরির একক ব্লক (মূলত একটি ম্যাট্রিক্স)।

  2. আপনি একটি তৈরি করতে পারবেন না MyClass[10][20]কারণ প্রতিটি উপ-অ্যারে পৃথক করে শুরু করতে হবে, কারণ সেগুলি পৃথক পৃথক বস্তু:

    MyClass[][] abc = new MyClass[10][];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20];
    }
    

    MyClass[10,20]ঠিক আছে, কারণ এটি 10 ​​টি সারি এবং 20 কলাম সহ ম্যাট্রিক্স হিসাবে একটি একক বস্তুর সূচনা করছে।

  3. একটি MyClass[][,][,](পরীক্ষিত কম্পাইল না যদিও) যাতে মত সক্রিয়া করা যেতে পারে:

    MyClass[][,][,] abc = new MyClass[10][,][,];
    
    for (int i=0; i<abc.Length; i++) {
        abc[i] = new MyClass[20,30][,];
    
        for (int j=0; j<abc[i].GetLength(0); j++) {
            for (int k=0; k<abc[i].GetLength(1); k++) {
                abc[i][j,k] = new MyClass[40,50];
            }
        }
    }
    

মনে রাখবেন, সিএলআর একক মাত্রা অ্যারে অ্যাক্সেসের জন্য ভারী অনুকূলিত হয়েছে, তাই জেগড অ্যারে ব্যবহার করা সম্ভবত একই আকারের বহুমাত্রিক অ্যারের চেয়ে দ্রুত হবে।


6
আপনি কি আমাদের কিছু প্রমাণের দিকে নির্দেশ করতে পারেন যে একক মাত্রিক অ্যারে অ্যাক্সেস দ্রুত হয়?
গ্রেয় ক্লাউড


বহুমাত্রিক অ্যারে জন্য একটি (সাধারণ) ব্যবহারের কেস আছে?
ryanwebjackson

4
উদাহরণ: পরীক্ষিত বোর্ড var board = new Piece[8, 8];, একটি রূপান্তর ম্যাট্রিক্স var m = new double[2, 2];
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

40

একটি জেগড অ্যারে অ্যারের অ্যারে। প্রতিটি অ্যারে একই আকারের গ্যারান্টিযুক্ত হয় না। আপনি থাকতে পারে

int[][] jaggedArray = new int[5][];
jaggedArray[0] = new[] {1, 2, 3}; // 3 item array
jaggedArray[1] = new int[10];     // 10 item array
// etc.

এটি সম্পর্কিত অ্যারেগুলির একটি সেট

অন্যদিকে, একটি বহুমাত্রিক অ্যারে, বাক্স, টেবিল, কিউব ইত্যাদির মতো অনেকগুলি সমন্বিত গ্রুপিং, যেখানে কোনও অনিয়মিত দৈর্ঘ্য নেই। ঐটাই বলতে হবে

int i = array[1,10];
int j = array[2,10]; // 10 will be available at 2 if available at 1

আমি আপনার কোড চেষ্টা করেছিলাম। এটি সংকলন হয়নি। ইন্ট যোগ করার চেষ্টা করুন [3] তাই চেষ্টা করুন jaggedArray[0] = int[3]{ 1, 2, 3 };
বারলপ

আমি জানি এটি পুরানো, তবে কেবল তথ্যগত উদ্দেশ্যে [3] প্রয়োজনীয় নয়। একটি সাধারণ ইনট [] সমস্ত কিছু গুরুত্বপূর্ণ। int [] [] আমারআর্য = নতুন ইনট্রি [5] []; myArray [0] = নতুন ইনট [] {1, 2, 3, 4}; এটাই হ'ল প্রয়োজনীয় is
ভেলোসিবাডজারি

আপনি কি এটি সি # তে সংকলন করতে পারবেন? আমি jaggedArray[0] = { 1, 2, 3 };এটি পরিবর্তন না করে = new[] { 1, 2, 3 }(বা = new int[] { 1, 2, 3 }সি # 3.0 এর আগে) সংকলন করতে পারি না । মাইক্রোসফ্টের সি # প্রোগ্রামিং গাইড অনুসারে , "আপনি একটি অ্যারে ভেরিয়েবলটি তৈরি না করেই ঘোষণা করতে পারেন, তবে এই ভেরিয়েবলটিতে নতুন অ্যারে নির্ধারণ করার সময় আপনাকে অবশ্যই নতুন অপারেটরটি ব্যবহার করতে হবে।"
জোয়েল ভি। আর্নেস্ট-দেইং

11

একটি আয়তক্ষেত্রাকার অ্যারে সর্বদা প্রতিটি সারির জন্য একই পরিমাণে কলাম থাকে।

MyClass[,] x = new MyClass[10,30]

প্রতিটি সারিতে 30 টি কলাম রয়েছে, তবে জেগে থাকা অ্যারেতে এটি প্রয়োজন হয় না। অতএব, আমি মনে করি আপনাকে দাগযুক্ত অ্যারেতে প্রতিটি 'সারি' আলাদাভাবে শুরু করতে হবে:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[30];
}

প্রকৃতপক্ষে, এর অর্থ হ'ল দাগযুক্ত অ্যারেতে প্রতিটি সারিতে একই সংখ্যক উপাদান থাকতে হবে না। (আমার উদাহরণে এটির সাথে একই সংখ্যক উপাদান রয়েছে তবে এটি প্রয়োজন হয় না)।

আপনি নিখুঁতভাবে এটি করতে পারেন, উদাহরণস্বরূপ:

MyClass[][] x = new MyClass[10][];

for(int i = 0; i < 10; i++)
{
    x[i] = new MyClass[(30 + i)];
}

এটি আপনার জন্য একটি আকর্ষণীয় নিবন্ধ হতে পারে।


5

বিজ্ঞাপন 3) যেমন একটি দৈত্য সূচনা [][,][,]করতে, আপনি যেমন কিছু করতে পারেন:

        int [,][,] multiArr1 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };
        int [,][,] multiArr2 = { { new int[,] { { 2, 2 }, { 1, 1 } },
                                     new int[,] { { 2, 2 }, { 1, 1 } } },
                                     { new int[,] { { 2, 2 }, { 1, 1 } },
                                         new int[,] { { 2, 2 }, { 1, 1 } } } };

        int [][,][,] superMultiArray = { multiArr1, multiArr2 };

1

আপনি যদি সীমা নির্ধারণ করে এমন একটি বহুমাত্রিক অ্যারে খুঁজছেন তবে সর্বদা [,]শৈলী বাক্য গঠন ব্যবহার করুন । এটি নিশ্চিত করবে যে প্রতিটি অংশ সমান আকারের।

আপনি যখন [][]যা যা ব্যবহার করছেন তা হ'ল আপনি অ্যারের অ্যারে তৈরি করছেন। তারপরে এর অর্থ হ'ল প্রতিটি অ্যারে আলাদা আলাদা আকারের হতে পারে। উদাহরণ স্বরূপ:

int[][] jaggedArray = new int[5][]
for(int index = 0; index < jaggedArray.Length ; ++index)
{
    jaggedArray[index] = new int[index + 1];
}


1

# 1 এর জন্য, এই এসও প্রশ্নটি দেখুন

জেগড বা বহুমাত্রিক ইনলাইন অ্যারেগুলির জন্য, এই প্রোগ্রামিং গাইডটি দেখুন :

// Three-dimensional array.
int[, ,] array3D = new int[,,] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };

// Same array with dimensions specified at declaration.
int[, ,] array3Da = new int[2, 2, 3] { { { 1, 2, 3 }, { 4, 5, 6 } },
{ { 7, 8, 9 }, { 10, 11, 12 } } };

আপনাকে মাত্রাগুলি (অ্যারে 3 ডি) নির্দিষ্ট করতে হবে না তবে আপনি যদি জানেন যে সেগুলি কখনই বদলাচ্ছে না, আপনি কী মাত্রা (অ্যারে 3 ডিএ) ব্যবহার করছেন তা জানার জন্য এটি সহায়ক।


0

ডাবল সূচককে একক রূপান্তরিত করা ব্যতীত আপনাকে অ্যারের অভ্যন্তরীণ কাজটি একক মাত্রিক অ্যারে হিসাবে একক মাত্রিক অ্যারে হিসাবে বুঝতে হবে।

সি # তে আপনার জেগড অ্যারে অবজেক্ট অ্যারেগুলিতে অবজেক্টগুলির একটি অ্যারে।


0

আমি মনে করি যে সি # তে 2 ডি জ্যাজেড অ্যারে মেমরি বরাদ্দকরণ সি ++ এবং সি তে 2 ডি অ্যারেগুলির মতো কারণ 2 ডি জ্যাজেড অ্যারেগুলিতে পয়েন্টার রয়েছে যা পয়েন্টারগুলির অ্যারেকে নির্দেশ করে যে এই পয়েন্টারগুলির প্রত্যেকটি উপাদানগুলির একটি অ্যারেতে নির্দেশ করে (উদাহরণস্বরূপ পূর্ণসংখ্যার উপাদান); সি ++ তে এই কোডটি পছন্দ করুন

int** 2DArr {new int* [number1]};
for (int i = 0; i < number1; i++)
{
   2DArr[i] = new int[number2];
}

কোড বেলো এর মেমরি বরাদ্দকরণ সি # তে 2 ডি জাগড অ্যারেগুলির সমান। তবে আমি সন্দেহজনক, আমি যদি ভুল উপায়ে চিন্তা করি তবে আপনি কি আরও ব্যাখ্যা করতে পারেন?


0

এই পোস্টটি পুরানো তবে এখানে আমার মতামত রয়েছে।

জেগড অ্যারেগুলি বহুমাত্রিক অ্যারে। বহুমাত্রিক অ্যারে দুটি ধরণের আসে: আয়তক্ষেত্রাকার এবং জেগড। আয়তক্ষেত্রাকার অ্যারেগুলি মেমরির একটি এন-ডাইমেনশনাল ব্লক উপস্থাপন করে এবং জেগড অ্যারে অ্যারেগুলির অ্যারে।

আয়তক্ষেত্রাকার অ্যারে

আয়তক্ষেত্রাকার অ্যারেগুলি প্রতিটি মাত্রা পৃথক করতে কমা ব্যবহার করে ঘোষণা করা হয়। নিম্নলিখিত বিবৃতিটি একটি আয়তক্ষেত্রাকার দ্বি-মাত্রিক অ্যারে ঘোষণা করে, যেখানে মাত্রা 3 × 3:

int[,] matrix = new int [3, 3]; 

জেগড অ্যারে

জাগড অ্যারেগুলি প্রতিটি মাত্রার প্রতিনিধিত্ব করার জন্য ধারাবাহিক বর্গাকার বন্ধনী ব্যবহার করে ঘোষণা করা হয়। দাগযুক্ত দ্বি-মাত্রিক অ্যারে ঘোষণার উদাহরণ এখানে রয়েছে, যেখানে বহিরাগত দিকের মাত্রা 3:

int[][] matrix = new int[3][];

0

বহুমাত্রিক অ্যারের জন্য বাক্স বা আয়তক্ষেত্রটি ভাবেন। প্রতিটি সারি একই দৈর্ঘ্য এবং প্রতিটি কলাম একই দৈর্ঘ্য।

জাজযুক্ত অ্যারেতে, সারি এবং কলামগুলি একই আকারের নাও হতে পারে। উদাহরণস্বরূপ, কলামগুলি বা সারিগুলি বিভিন্ন আকারের হতে পারে। এটি এমন আকারে নিয়ে যাবে যা আয়তক্ষেত্রের মতো পাশের নীচে সরল রেখা নাও থাকতে পারে। পরিবর্তে পক্ষগুলি ঝাঁকুনির সাথে থাকতে পারে ।

এই উদাহরণের জন্য এখন আমি 2 টি মাত্রা / 2 অ্যারে ব্যবহার করেছি তবে এটি আরও বেশি ক্ষেত্রে প্রযোজ্য।

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