আমি কেন সি # তে অ্যারের মতো একটি তালিকা শুরু করতে পারি?


131

আজ আমি সি # তে যা করতে পেরে অবাক হয়েছি:

List<int> a = new List<int> { 1, 2, 3 };

আমি কেন এটি করতে পারি? কনস্ট্রাক্টর কে বলা হয়? আমি কীভাবে নিজের ক্লাসে এটি করতে পারি? আমি জানি যে এটি অ্যারে আরম্ভ করার উপায় তবে অ্যারেগুলি ভাষা আইটেম এবং তালিকাগুলি সরল অবজেক্ট ...


1
এই প্রশ্নটি সহায়ক হতে পারে: স্ট্যাকওভারফ্লো.com
বব কাউফম্যান

10
খুব সুন্দর হাহ? { { "key1", "value1"}, { "key2", "value2"} }
অভিধানগুলি

অন্য ভিউ থেকে এই আরে ইনিশিয়ালাইজেশন সিনট্যাক্সের মতো আমাদের একটি অনুস্মারক দেয় যে এর অন্তর্নিহিত ডেটা ধরণের List<int>আসলে কেবল একটি অ্যারে হয়। আমি সি # টিমকে ঘৃণা করি এজন্য যে তারা এটিকে নাম না দেয় ArrayList<T>যা এতো স্পষ্ট এবং স্বাভাবিক বলে মনে হয়।
আরবিটি

উত্তর:


183

এটি .NET- এ সংগ্রহ সূচনা সংশ্লেষের অংশ। আপনি যতক্ষণ না তৈরি করেন কোনও সংকলনে এই বাক্য গঠনটি ব্যবহার করতে পারেন:

  • এটি প্রয়োগ করে IEnumerable(পছন্দসই IEnumerable<T>)

  • এটির একটি পদ্ধতি রয়েছে Add(...)

যা ঘটে তা ডিফল্ট কনস্ট্রাক্টর বলা হয় এবং তারপরে Add(...)ইনিশিয়ালাইজারের প্রতিটি সদস্যের জন্য ডাকা হয়।

সুতরাং, এই দুটি ব্লক মোটামুটি একরকম:

List<int> a = new List<int> { 1, 2, 3 };

এবং

List<int> temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
List<int> a = temp;

আপনি করতে পারেন উদাহরণস্বরূপ ওভার নির্ধারন প্রতিরোধ, যদি আপনি চান একটি বিকল্প কন্সট্রাকটর কল List<T>ক্রমবর্ধমান, ইত্যাদি সময়:

// Notice, calls the List constructor that takes an int arg
// for initial capacity, then Add()'s three items.
List<int> a = new List<int>(3) { 1, 2, 3, }

নোট করুন যে Add()পদ্ধতিতে একটি আইটেম গ্রহণ করা প্রয়োজন নয়, উদাহরণস্বরূপ Add()পদ্ধতিটির জন্য Dictionary<TKey, TValue>দুটি আইটেম লাগে:

var grades = new Dictionary<string, int>
    {
        { "Suzy", 100 },
        { "David", 98 },
        { "Karen", 73 }
    };

মোটামুটি একইরকম:

var temp = new Dictionary<string, int>();
temp.Add("Suzy", 100);
temp.Add("David", 98);
temp.Add("Karen", 73);
var grades = temp;

সুতরাং, আপনার নিজের শ্রেণিতে এটি যুক্ত করার জন্য, যেমনটি বলা হয়েছে, আপনার যা যা করা দরকার তা বাস্তবায়িত হয় IEnumerable(আবার, পছন্দসই IEnumerable<T>) এবং এক বা একাধিক Add()পদ্ধতি তৈরি করুন :

public class SomeCollection<T> : IEnumerable<T>
{
    // implement Add() methods appropriate for your collection
    public void Add(T item)
    {
        // your add logic    
    }

    // implement your enumerators for IEnumerable<T> (and IEnumerable)
    public IEnumerator<T> GetEnumerator()
    {
        // your implementation
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

তারপরে আপনি এটি ছাত্রলীগের সংগ্রহের মতোই ব্যবহার করতে পারেন:

public class MyProgram
{
    private SomeCollection<int> _myCollection = new SomeCollection<int> { 13, 5, 7 };    

    // ...
}

(আরও তথ্যের জন্য, এমএসডিএন দেখুন )


29
উত্তম উত্তর, যদিও আমি লক্ষ করেছি যে আপনার প্রথম উদাহরণে "হুবহু অভিন্ন" বলা মোটেও সঠিক নয়। এটি হুবহু অভিন্ন List<int> temp = new List<int>(); temp.Add(1); ... List<int> a = temp; যা হ'ল, সমস্ত aঅ্যাডগুলি বলার পরে ভেরিয়েবলটি আরম্ভ করা হয় না । নইলে এমন কিছু করা আইনী হবে List<int> a = new List<int>() { a.Count, a.Count, a.Count };যা করা একটি পাগল জিনিস।
এরিক লিপার্ট

1
@ user606723 আছে: মধ্যে কোনো পার্থক্য নয় List<int> a; a = new List<int>() { a.Count };এবংList<int> a = new List<int>() { a.Count };
Joren

4
@ জোরেন: আপনি ঠিক বলেছেন; আসলে সি # স্পেসিফিকেশন বলে যেT x = y; একই রকম T x; x = y;, এই ঘটনাটি কিছু অদ্ভুত পরিস্থিতি তৈরি করতে পারে। উদাহরণস্বরূপ, int x = M(out x) + x;পুরোপুরি আইনী কারণ int x; x = M(out x) + x;আইনী।
এরিক লিপার্ট

1
@ জামেসমিশেলএহর এটি প্রয়োগ করা প্রয়োজন হয় না IEnumerable<T>; IEnumerableসংগ্রহ-প্রারম্ভিক সিনট্যাক্স ব্যবহারের অনুমতি দেওয়ার জন্য নন-জেনেরিক যথেষ্ট।
ফোগ

2
আপনি যদি এমন একধরণের সংগ্রহ ব্যবহার করেন যা আইডিজিপোজেবল কার্যকর করে তবে এরিকের বিষয়টি গুরুত্বপূর্ণ। using (var x = new Something{ 1, 2 })কোনও একটি Addকল ব্যর্থ হলে অবজেক্টটি নিষ্পত্তি করবে না ।
porges

11

একে সিনট্যাকটিক চিনি বলা হয় ।

List<T> এটি "সাধারণ" শ্রেণি, তবে আপনার জীবনকে আরও সহজ করার জন্য সংকলক এটিতে একটি বিশেষ চিকিত্সা দেয়।

এই এক বলা হয় সংগ্রহ আরম্ভকারী । আপনার বাস্তবায়ন IEnumerable<T>এবং Addপদ্ধতি প্রয়োজন।


8

মতে C # এর সংস্করণ 3.0 স্পেসিফিকেসন "সংগ্রহ বস্তুর জন্য একটি সংগ্রহ সূচনাকারী প্রয়োগ করা হয় ঠিক একটি টি জন্য একটি টাইপ যে কার্যকরী System.Collections.Generic.ICollection হওয়া আবশ্যক"

তবে এই তথ্যটি এই লেখার মতোই সঠিক নয় বলে মনে হয়; নীচের মন্তব্যে এরিক লিপার্টের স্পষ্টতা দেখুন।


10
পৃষ্ঠাটি সঠিক নয়। এটা আমার নজরে আনার জন্য ধন্যবাদ। এটি অবশ্যই প্রাথমিক-প্রকাশের প্রাথমিক ডকুমেন্টেশন হতে হবে যা কোনওভাবে কখনও মোছা হয়নি। আসল নকশাটির জন্য আইকোলিকেশন প্রয়োজন ছিল, তবে এটি আমরা স্থির হওয়া চূড়ান্ত নকশা নয়।
এরিক লিপার্ট

1
সুস্পষ্ট করার জন্য ধন্যবাদ.
অলিভিয়ার জ্যাকট-ডেস্কোম্বেস


6

সংগ্রহ আরম্ভকারীগুলির সম্পর্কে আর একটি দুর্দান্ত জিনিস হ'ল আপনার একাধিক Addপদ্ধতিতে প্রচুর ওভারলোড থাকতে পারে এবং আপনি সেগুলিকে একই ইনিশিয়ালাইজারে কল করতে পারেন! উদাহরণস্বরূপ এটি কাজ করে:

public class MyCollection<T> : IEnumerable<T>
{
    public void Add(T item, int number)
    {

    }
    public void Add(T item, string text) 
    {

    }
    public bool Add(T item) //return type could be anything
    {

    }
}

var myCollection = new MyCollection<bool> 
{
    true,
    { false, 0 },
    { true, "" },
    false
};

এটি সঠিক ওভারলোডগুলি কল করে। এছাড়াও, এটি নামের সাথে কেবল পদ্ধতিটি দেখায় Add, রিটার্নের ধরণটি যে কোনও কিছু হতে পারে।


0

সিনট্যাক্সের মতো অ্যারে Add()কলগুলির একটি সিরিজে পরিণত হচ্ছে ।

আরও আকর্ষণীয় উদাহরণে এটি দেখতে, নীচের কোডটি বিবেচনা করুন যাতে আমি দুটি আকর্ষণীয় কাজ করি যা প্রথমে সি # তে অবৈধ বলে মনে হয়, 1) একটি পঠনযোগ্য সম্পত্তি সেট করা, 2) আরম্ভের মতো অ্যারের সাথে একটি তালিকা স্থাপন করা।

public class MyClass
{   
    public MyClass()
    {   
        _list = new List<string>();
    }
    private IList<string> _list;
    public IList<string> MyList 
    { 
        get
        { 
            return _list;
        }
    }
}
//In some other method
var sample = new MyClass
{
    MyList = {"a", "b"}
};

এই কোডটি নিখুঁতভাবে কাজ করবে, যদিও 1) মাইলিস্টটি কেবল পঠনযোগ্য এবং 2) আমি অ্যারে ইনিশিয়ালাইজারের সাথে একটি তালিকা সেট করি।

কেন এটি কাজ করে, কারণ কোডটিতে যা কোনও অবজেক্ট ইনটালাইজারের অংশ, সংকলকটি সর্বদা {}এমন একটি সিরিজের Add()কলকে এমন একটি সিনট্যাক্স ঘুরিয়ে দেয় যা পুরোপুরি আইনসম্মত এমনকি পাঠ্যক্ষেত্রেও উপযুক্ত legal

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