অ্যারে বিভাগ <T> শ্রেণীর ব্যবহার কী?


101

ক্লাস ArraySegment<byte>সাবক্লাসিং করার সময় আমি টাইপটি পেরিয়ে এসেছি MessageEncoder

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


8
দেখে মনে হচ্ছে ArraySegmentএটি .Net 4.5।
সুইভ

এই প্রশ্নের মতো চেষ্টা করার জন্য ..
কেন কিন

উত্তর:


57

ArraySegment<T>নেট নেট 4.5 + এবং নেট নেট এখন এটি প্রয়োগ করে অনেক বেশি দরকারী হয়ে উঠেছে :

  • IList<T>
  • ICollection<T>
  • IEnumerable<T>
  • IEnumerable
  • IReadOnlyList<T>
  • IReadOnlyCollection<T>

.NET 4 সংস্করণের বিপরীতে যা কোনও ইন্টারফেস প্রয়োগ করে নি।

ক্লাসটি এখন লিনকিউ-এর বিস্ময়কর বিশ্বে অংশ নিতে সক্ষম হয়েছে যাতে আমরা সামগ্রিক লিনকিউ বিষয়গুলি যেমন বিষয়বস্তুগুলি জিজ্ঞাসা করতে পারি, মূল অ্যারেটিকে প্রভাবিত না করে সামগ্রীগুলি উল্টিয়ে দিতে পারি, প্রথম আইটেমটি পেতে পারি এবং আরও:

var array = new byte[] { 5, 8, 9, 20, 70, 44, 2, 4 };
array.Dump();
var segment = new ArraySegment<byte>(array, 2, 3);
segment.Dump(); // output: 9, 20, 70
segment.Reverse().Dump(); // output 70, 20, 9
segment.Any(s => s == 99).Dump(); // output false
segment.First().Dump(); // output 9
array.Dump(); // no change

4
যদিও তারা অনির্বচনীয়ভাবে GetEnumeratorব্যক্তিগত তৈরি করেছে , এর অর্থ আপনাকে IEnumerable<T>এটিকে কল করার জন্য (একটি বক্সিং রূপান্তর) দিতে বাধ্য করা হবে। উঘ!
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

27
  1. আইও ক্লাসগুলির জন্য বাফার বিভাজন - একই সাথে পড়ার ও লেখার ক্রিয়াকলাপগুলির জন্য একই বাফারটি ব্যবহার করুন এবং আপনার সম্পূর্ণ ক্রিয়াকলাপ বর্ণনা করে এমন একক কাঠামো আপনি পাস করতে পারেন।
  2. ফাংশন সেট করুন - গাণিতিকভাবে বলতে গেলে আপনি এই নতুন কাঠামোটি ব্যবহার করে যে কোনও সংযুক্ত উপগ্রহের প্রতিনিধিত্ব করতে পারেন। এর মূল অর্থ আপনি অ্যারের পার্টিশন তৈরি করতে পারবেন তবে আপনি সমস্ত প্রতিকূলতা এবং সমস্ত সন্ধ্যায় বলতে পারবেন না। নোট করুন যে থে 1 দ্বারা প্রস্তাবিত ফোন টিজারটি অ্যারেসিগমেন্ট বিভাজন এবং একটি বৃক্ষ কাঠামো ব্যবহার করে খুব সুন্দরভাবে সমাধান করা যেতে পারে। প্রথমে গাছের গভীরতা অতিক্রম করে চূড়ান্ত সংখ্যাগুলি লেখা যেতে পারে। আমি বিশ্বাস করি স্মৃতি এবং গতির দিক থেকে এটি একটি আদর্শ দৃশ্য হতে পারে।
  3. মাল্টিথ্রেডিং - কন্ট্রোল গেট হিসাবে বিভাগিত অ্যারেগুলি ব্যবহার করার সময় আপনি এখন একই তথ্য উত্সের উপর পরিচালনা করতে একাধিক থ্রেড স্প্যান করতে পারেন। পৃথক গণনা ব্যবহার করে এমন লুপগুলি এখন বেশ সহজেই বাইরে আনা যায়, এটি সর্বশেষ সি ++ সংকলক কোড অপ্টিমাইজেশন পদক্ষেপ হিসাবে শুরু করছে।
  4. ইউআই বিভাজন - বিভাগযুক্ত কাঠামো ব্যবহার করে আপনার ইউআই প্রদর্শনগুলি সীমাবদ্ধ করুন। আপনি এখন ডেটা পৃষ্ঠাগুলি প্রতিনিধিত্বকারী স্ট্রাকচারগুলি সঞ্চয় করতে পারেন যা প্রদর্শন ফাংশনগুলিতে দ্রুত প্রয়োগ করা যেতে পারে। একক নমনীয় অ্যারেগুলি পৃথক পৃথক দর্শনগুলি প্রদর্শন করতে বা এমনকি ট্রাইভিউয়ের নোডের মতো শ্রেণিবদ্ধ কাঠামো যেমন নোড সংগ্রহের বিভাগগুলিতে রৈখিক ডেটা স্টোরকে ভাগ করে দেখানো যায়।

এই উদাহরণে, আমরা কীভাবে আপনি মূল অ্যারে, অফসেট এবং গণনা বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন এবং অ্যারেসিগমেন্টে উল্লিখিত উপাদানগুলির মাধ্যমে কীভাবে লুপ করতে পারেন তাও আমরা লক্ষ্য করি।

using System;

class Program
{
    static void Main()
    {
        // Create an ArraySegment from this array.
        int[] array = { 10, 20, 30 };
        ArraySegment<int> segment = new ArraySegment<int>(array, 1, 2);

        // Write the array.
        Console.WriteLine("-- Array --");
        int[] original = segment.Array;
        foreach (int value in original)
        {
            Console.WriteLine(value);
        }

        // Write the offset.
        Console.WriteLine("-- Offset --");
        Console.WriteLine(segment.Offset);

        // Write the count.
        Console.WriteLine("-- Count --");
        Console.WriteLine(segment.Count);

        // Write the elements in the range specified in the ArraySegment.
        Console.WriteLine("-- Range --");
        for (int i = segment.Offset; i < segment.Count+segment.Offset; i++)
        {
            Console.WriteLine(segment.Array[i]);
        }
    }
}

অ্যারেসিগমেন্ট স্ট্রাকচার - তারা কী ভাবছিল?


4
অ্যারেসিগমেন্ট কেবল একটি কাঠামো। আমার সর্বোত্তম অনুমান যে এর উদ্দেশ্য হ'ল কোনও অ্যারের একটি অংশ এটির একটি অনুলিপি না দিয়েই পাশ কাটিয়ে দেওয়া।
ব্রায়ান

4
আমি বিশ্বাস করি যে লুপটির শর্ত বিবরণী হওয়া উচিত i < segment.Offset + segment.Count
এরেন এরসনেমেজ

4
আপনি উল্লিখিত তথ্যের জন্য +1 কিন্তু @ ইরেন সঠিক: আপনি কোনও বিভাগের উপাদানগুলির মতো পুনরাবৃত্তি করতে পারবেন না।
akafak Gür

4
আপনি যখন কারও এলিস কোড ব্যবহার করেন তখন এট্রিবিউশন দেওয়া সাধারণত উপযুক্ত। এটা ঠিক ভাল আচরণ। আপনার উদাহরণটি ডটনেটারপ্লেলস / অ্যারেজেগমেন্ট থেকে উদ্ভূত

4
অবশ্যই না, তারা আপনার উত্তর থেকে এটি ধার নিয়েছে। কোন ক্ষেত্রে, তাদের আপনার ক্রেডিট দেওয়া উচিত। :)

27

এটি একটি পাণিযুক্ত ছোট সৈনিক কাঠামো যা অ্যারের রেফারেন্স রাখার পরিবর্তে কিছুই করে না এবং একটি সূচক পরিসীমা সঞ্চয় করে। কিছুটা বিপজ্জনক, সাবধান হোন যে এটি অ্যারের ডেটার একটি অনুলিপি তৈরি করে না এবং কোনওভাবে অ্যারেটিকে স্থাবর করে তুলবে না বা অপরিবর্তনীয়তার প্রয়োজনীয়তা প্রকাশ করবে না। আরও সাধারণ প্রোগ্রামিং প্যাটার্নটি হ'ল অ্যারে এবং একটি দৈর্ঘ্যের ভেরিয়েবল বা প্যারামিটার রাখা বা পাস করা, যেমন এটি .NET বিগিনিডার () পদ্ধতি, স্ট্রিং.সুবস্ট্রিং (), এনকোডিং.গেটস্ট্রিং (), ইত্যাদি ইত্যাদিতে করা হয় etc.

ওয়েব সকেটে এবং ডাব্লুসিএফ পছন্দ করে এমন একটি নির্দিষ্ট মাইক্রোসফ্ট প্রোগ্রামার মত বলে মনে হচ্ছে তা বাদে এটি নেট ফ্রেমওয়ার্কের মধ্যে খুব বেশি ব্যবহার পায় না। কোনটি সম্ভবত সঠিক দিকনির্দেশনা, যদি আপনি এটি পছন্দ করেন তবে এটি ব্যবহার করুন। এটি .NET 4.6-এ পিক-এ-বু-এ করেছে, যোগ করা মেমোরিস্ট্রিম ry ট্রাইগেটবার্গার () পদ্ধতিটি এটি ব্যবহার করে। outআমি ধরে নিলাম দুটি যুক্তি থাকার চেয়ে পছন্দসই ।

সাধারণভাবে, স্লাইসগুলির আরও সার্বজনীন ধারণা প্রিন্সিপাল .এনইটি ইঞ্জিনিয়ারদের ম্যাডস টর্গারসেন এবং স্টিফেন টুবের ইচ্ছার তালিকায় বেশি। পরে array[:]সিন্টেক্স প্রস্তাবটি লাথি মেরেছিল কিছুক্ষণ আগে, আপনি দেখতে পাবেন তারা এই রোজলিন পৃষ্ঠায় কী নিয়ে ভাবছেন । আমি ধরে নেব যে সিএলআর সমর্থন পাওয়াটাই শেষ পর্যন্ত এর উপর নির্ভর করে। এটি সি # সংস্করণ 7 এর জন্য সক্রিয়ভাবে বিবেচনা করা হচ্ছে, আপনার নজর System.Slicesরাখুন

আপডেট: মৃত লিঙ্ক, এটি 7.2 সংস্করণটিতে স্প্যান হিসাবে প্রেরণ করা হয়েছে ।

আপডেট 2: রেঞ্জ এবং সূচক প্রকার এবং একটি স্লাইস () পদ্ধতি সহ সি # সংস্করণ 8.0 এ আরও সমর্থন।


"এটি খুব দরকারী নয় '- আমি এমন একটি সিস্টেমে এটি অবিশ্বাস্যরূপে দরকারী বলে মনে করেছি যে দুর্ভাগ্যক্রমে মেমরির সীমাবদ্ধতার কারণে মাইক্রো অপ্টিমাইজেশনের প্রয়োজন হয়েছিল other এছাড়াও অন্যান্য" সাধারণ "সমাধানগুলিও এর ইউটিলিটি থেকে বিচ্যুত হয় না
অ্যারোন এইচএস

5
ঠিক আছে, ঠিক আছে, আমার এটি ব্যবহারের অভ্যাসে থাকা প্রত্যেকের কাছ থেকে সত্যিকারের প্রশংসাপত্রের দরকার নেই :) ক্রাইসের মন্তব্যে উজ্জীবিত সেরা। যেমনটি উল্লেখ করা হয়েছে, "আপনি যদি এটি পছন্দ করেন তবে এটি ব্যবহার করুন"। সুতরাং এটি ব্যবহার করুন। স্লাইস দুর্দান্ত হবে, অপেক্ষা করতে পারবেন না।
হ্যানস প্যাস্যান্ট

সেখানকার অপরিবর্তনীয় পিউরিস্টদের জন্য রিডইনলিস্প্যান রয়েছে।
আরেক বাল

ArraySegmentইনডেক্সার রয়েছে Memoryএবং Spanএটি সম্পর্কে নিরব রয়েছেন ।
নভোচারী

7

একটি মোড়ক ক্লাস সম্পর্কে কি? টেম্পোরাল বাফারগুলিতে কেবল অনুলিপি ডেটা এড়াতে।

public class SubArray<T> {
        private ArraySegment<T> segment;

        public SubArray(T[] array, int offset, int count) {
            segment = new ArraySegment<T>(array, offset, count);
        }
        public int Count {
            get { return segment.Count; }
        }

        public T this[int index] {
            get {
               return segment.Array[segment.Offset + index];
            }
        }

        public T[] ToArray() {
            T[] temp = new T[segment.Count];
            Array.Copy(segment.Array, segment.Offset, temp, 0, segment.Count);
            return temp;
        }

        public IEnumerator<T> GetEnumerator() {
            for (int i = segment.Offset; i < segment.Offset + segment.Count; i++) {
                yield return segment.Array[i];
            }
        }
    } //end of the class

উদাহরণ:

byte[] pp = new byte[] { 1, 2, 3, 4 };
SubArray<byte> sa = new SubArray<byte>(pp, 2, 2);

Console.WriteLine(sa[0]);
Console.WriteLine(sa[1]);
//Console.WriteLine(b[2]); exception

Console.WriteLine();
foreach (byte b in sa) {
    Console.WriteLine(b);
}

আউটপুট:

3
4

3
4

খুব দরকারী বন্ধু, ধন্যবাদ, দ্রষ্টব্য আপনি এটি প্রয়োগ করতে পারেন এবং IEnumerable<T>তারপরে IEnumerator যুক্ত করুনIEnumerable.GetEnumerator() { return GetEnumerator(); }
MaYaN

5

অ্যারে বিভাগটি আপনার ভাবার চেয়ে অনেক বেশি কার্যকর is নিম্নলিখিত ইউনিট পরীক্ষা চালানোর চেষ্টা করুন এবং অবাক হওয়ার জন্য প্রস্তুত!

    [TestMethod]
    public void ArraySegmentMagic()
    {
        var arr = new[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

        var arrSegs = new ArraySegment<int>[3];
        arrSegs[0] = new ArraySegment<int>(arr, 0, 3);
        arrSegs[1] = new ArraySegment<int>(arr, 3, 3);
        arrSegs[2] = new ArraySegment<int>(arr, 6, 3);
        for (var i = 0; i < 3; i++)
        {
            var seg = arrSegs[i] as IList<int>;
            Console.Write(seg.GetType().Name.Substring(0, 12) + i);
            Console.Write(" {");
            for (var j = 0; j < seg.Count; j++)
            {
                Console.Write("{0},", seg[j]);
            }
            Console.WriteLine("}");
        }
    }

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

আউটপুট:

ArraySegment0 {0,1,2,}
ArraySegment1 {3,4,5,}
ArraySegment2 {6,7,8,}

4
দুঃখের বিষয় এটি এটিকে দেওয়া দরকার IList<T>। আমি সূচক হতে হবে আশা করি public
xmedeko

4
যে কেউ এই উত্তরটি নিয়ে আসে এবং এটি একটি অলৌকিক সমাধান বলে মনে করে, আমি আপনাকে প্রথমে আপনার পারফরম্যান্সের প্রয়োজনগুলি বিবেচনা করার পরামর্শ দিই এবং অ্যারে বিভাগ থেকে সূচক সীমাবদ্ধতাগুলি ব্যবহার করে মূল অ্যারেতে সরাসরি অ্যাক্সেসের সাথে তুলনা করে এটি বেঞ্চমার্ক করুন। আইএলিস্টে কাস্টিংয়ের জন্য প্রয়োগ পদ্ধতিতে পৌঁছানোর আগে আইলিস্ট ইন্টারফেসের মধ্য দিয়ে ঝাঁপ দেওয়ার জন্য পরবর্তী পদ্ধতি কলগুলি (সূচক সহ) প্রয়োজন including ইন্টারনেটে প্রচুর আলোচনা রয়েছে যেখানে লোকেরা আঁট লুপগুলিতে বিমূর্ত কল ব্যবহারের পারফরম্যান্স ব্যয় সম্পর্কে কথা বলে। এখানে পড়ুন: github.com/dotnet/coreclr/issues/9105
জেমসহক্স

3

সরল কথায়: এটি একটি অ্যারের সাথে রেফারেন্স রাখে, আপনাকে একক অ্যারে ভেরিয়েবলের একাধিক রেফারেন্স রাখতে দেয়, প্রতিটি আলাদা আলাদা ব্যাপ্তি সহ।

প্রকৃতপক্ষে এটি আপনাকে সূচী সূচী এবং দৈর্ঘ্য ধরে রাখার জন্য একাধিক ভেরিয়েবলের পরিবর্তে আরও বেশি কাঠামোগত উপায়ে অ্যারের অংশগুলি ব্যবহার এবং পাস করতে সহায়তা করে। এছাড়াও এটি অ্যারে বিভাগগুলির সাথে আরও সহজে কাজ করার জন্য সংগ্রহ ইন্টারফেস সরবরাহ করে।

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

        byte[] arr1 = new byte[] { 1, 2, 3, 4, 5, 6 };
        ArraySegment<byte> seg1 = new ArraySegment<byte>(arr1, 2, 2);
        MessageBox.Show((seg1 as IList<byte>)[0].ToString());

এবং,

        byte[] arr1 = new byte[] { 1, 2, 3, 4, 5, 6 };
        int offset = 2;
        int length = 2;
        byte[] arr2 = arr1;
        MessageBox.Show(arr2[offset + 0].ToString());

স্পষ্টতই প্রথম কোড স্নিপেটটি বেশি পছন্দ করা হয়, বিশেষত যখন আপনি কোনও ফাংশনে অ্যারে বিভাগগুলি পাস করতে চান।

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