مرتب سازی داده های دیکشنری

m_mx2009

Member
با سلام.

من یک آرایه از نوع کلاس HashTable میسازم و تعدادی داده از انواع String و int رو توش ذخیره میکنم.این داده ها خودشون درون یک کلاس دیگه که خودش ساختمان داده است ذخیره میشه.ولی وقتی میخوام اشیاء رو با تابع sort() مرتب سازی کنم کامپایلر خطا میده.میشه بگید مشکل از کجاست؟

اینم کد برنامه :


کد:
public class Book : IDisposable
    {
        static List<Book> objects = new List<Book>();

        public Hashtable property = new Hashtable();
        public Book()
        {


            


        }

        ~Book()
        {
            MessageBox.Show("end");
        }

        //end of main definition

        public void addbook(params string[] names)
        {

            this.property.Add("name", names[0]);
            this.property.Add("writer", names[1]);
            this.property.Add("publisher", names[2]);
            this.property.Add("vol", names[3]);
            this.property.Add("number", names[4]);
            this.property.Add("desc", names[5]);
            this.property.Add("borrow", false);
            this.property.Add("lost", false);
            this.property.Add("number_of_borrow", 0);
            this.property.Add("date_added", DateTime.Now.Date.ToString().Substring(0, 8));
            objects.Add(this);
            

        }


        public void sortitems()
        {
            objects.Sort();
        }

    }

و با این متد شئ رو میسازم و فراخوانی میکنم(این کد ها درون کلاس اصلی برنامه قرار دارند) :


کد:
private  Book obj =null;
private void buttonX1_Click(object sender, EventArgs e)
        {
            obj = new Book();
            obj.addbook(textBox1.Text, textBox2.Text , "kk", "ff", "ss", "gg", "rr");
            
obj.sort(); xxxxxxx           
        }
در قسمتی که با xxxx نشون دادم کامپایلر زمان اجرا خطا میگیره.نمیدونم چه مشکلی داره!:rose::rose:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
با سلام.

من یک آرایه از نوع کلاس HashTable میسازم و تعدادی داده از انواع String و int رو توش ذخیره میکنم.این داده ها خودشون درون یک کلاس دیگه که خودش ساختمان داده است ذخیره میشه.ولی وقتی میخوام اشیاء رو با تابع sort() مرتب سازی کنم کامپایلر خطا میده.میشه بگید مشکل از کجاست؟

اینم کد برنامه :


کد:
public class Book : IDisposable
    {
        static List<Book> objects = new List<Book>();

        public Hashtable property = new Hashtable();
        public Book()
        {


            


        }

        ~Book()
        {
            MessageBox.Show("end");
        }

        //end of main definition

        public void addbook(params string[] names)
        {

            this.property.Add("name", names[0]);
            this.property.Add("writer", names[1]);
            this.property.Add("publisher", names[2]);
            this.property.Add("vol", names[3]);
            this.property.Add("number", names[4]);
            this.property.Add("desc", names[5]);
            this.property.Add("borrow", false);
            this.property.Add("lost", false);
            this.property.Add("number_of_borrow", 0);
            this.property.Add("date_added", DateTime.Now.Date.ToString().Substring(0, 8));
            objects.Add(this);
            

        }


        public void sortitems()
        {
            objects.Sort();
        }

    }

و با این متد شئ رو میسازم و فراخوانی میکنم(این کد ها درون کلاس اصلی برنامه قرار دارند) :


کد:
private  Book obj =null;
private void buttonX1_Click(object sender, EventArgs e)
        {
            obj = new Book();
            obj.addbook(textBox1.Text, textBox2.Text , "kk", "ff", "ss", "gg", "rr");
            
obj.sort(); xxxxxxx           
        }
در قسمتی که با xxxx نشون دادم کامپایلر زمان اجرا خطا میگیره.نمیدونم چه مشکلی داره!:rose::rose:

سه تا ایراد در کد تان می بینم، اول اینکه اگر اسم متدی که تعریف کردید ()sortitems است، چرا با ()obj.sort
فراخوانی اش می کنید؟
ایراد دوم اینه که objects از نوع static است و متعلق به کلاس و همگی شیء ها است، مرتب سازی اش هم
شامل همه شیء ها میشه، اینکه بنویسید ()obj.sortitems مثل این می مونه که بخواهید فقط شیء obj رو
مرتب کنید، در حالی که قراره ترتیب اشیاء داخل objects تغییر کند.

پس static رو به تعریف ()public void sortitems اضافه کنید و بجای ()obj.sortitems با ()Book.sortitems
فراخوانی اش کنید.

ایراد سوم اینه که اون کلاس List ای که ساخته اید هیچ اطلاعاتی در مورد دیدگاه شما نسبت به Book نداره،
از نظر اون Book یک کلاس ناشناخته است و با یکسری توابع ناشناخته.
نمیدونه که شیء book1 و شیء book2 رو باید بر اساس چه معیاری مقایسه کنه. در نتیجه نمی دونه
که جطور باید لیست کتاب ها رو مرتب کنه. شما باید برایش مشخص کنید که دو شیء از کلاس Book
چطوری با هم مقایسه شوند و در چه حالتی مساوی اند و در چه حالتی اولی بزرگنره و یا برعکس.

وقتی لیست خالیه و یا فقط یک عضو داره، بهتون گیر نمیده اما وقتی تعداد اعضاء به حدی رسید که
واقعا قرار شد مقایسه ای انجام بشه سر ()Sort خطا میده که نمی دونم چطور باید Book ها رو مقایسه کنم؟
باید یک کلاس IComparer بهش معرفی کنید که مقایسه یک به یک اشیاء رو انجام بده.
این کد ها داخل کلاس Book نوشته می شوند :
کد:
.
.
.
        public class BookComparer : IComparer<Book>
        {
            public int Compare(Book book1, Book book2)
            {
                if (book1 == null)
                {
                    if (book2 == null)
                    {
                        return 0;
                    }
                    return -1;
                }
                if (book2 == null)
                {
                    return 1;
                }
                return book1.property["name"].ToString().CompareTo(book2.property["name"]);
            }
        }

        public static void sortitems()
        {
[COLOR="Blue"][B]            objects.Sort(new BookComparer());[/B][/COLOR]
        }
 

m_mx2009

Member
دوست عزیز قطعه کدی که تعریف کردید مشکلم رو حل کرد خیلی ممنونم.

ولی من متوجه نحوه کارکردش نشدم.یعنی برای اینکه تابع sort() کار کنه باید از کلاس Icomparer استفاده بشه؟

من کتاب #C آقای جعفرنژاد رو میخونم .تو فصل ساختمان داده ها List ها رو به طور خلاصه توضیح داده ولی از کلاس Icomparer چیزی نگفته!!

در ضمن تو همین کتاب آقای جعفرنژاد برای اعضای static کلاس گفته شده : عضو static عضوی است که تمام اشیا< ساخته شده از کلاس میتونن بهش دسترسی داشته باشن.میخوام بدونم تنها خاصیت static تعریف کردن همینه؟
آخه تو ++C وقتی یک متد یا متغیر رو static تعریف میکردیم ، با به پایان رسیدن بلوک ازبین نمیرفت و در مراجعه بعدی میشد ازش استفاده کرد.آیا تو #C هم همینطوره؟


اگه میشه در این مورد هم توضیح بدین!:shock::shock::shock:
ارادتمند شما
 
آخرین ویرایش:

the_king

مدیرکل انجمن
دوست عزیز قطعه کدی که تعریف کردید مشکلم رو حل کرد خیلی ممنونم.

ولی من متوجه نحوه کارکردش نشدم.یعنی برای اینکه تابع sort() کار کنه باید از کلاس Icomparer استفاده بشه؟

من کتاب #C آقای جعفرنژاد رو میخونم .تو فصل ساختمان داده ها List ها رو به طور خلاصه توضیح داده ولی از کلاس Icomparer چیزی نگفته!!

در ضمن تو همین کتاب آقای جعفرنژاد برای اعضای static کلاس گفته شده : عضو static عضوی است که تمام اشیا< ساخته شده از کلاس میتونن بهش دسترسی داشته باشن.میخوام بدونم تنها خاصیت static تعریف کردن همینه؟
آخه تو ++C وقتی یک متد یا متغیر رو static تعریف میکردیم ، با به پایان رسیدن بلوک ازبین نمیرفت و در مراجعه بعدی میشد ازش استفاده کرد.آیا تو #C هم همینطوره؟


اگه میشه در این مورد هم توضیح بدین!:shock::shock::shock:
ارادتمند شما

والا من نمی دونم آقای جعفر نژاد چقدر #C بلده یا در کتابش در مورد #C چقدر نوشته، اما اینو می دونم که اصولا
اگه یک کتاب انگلیسی جامع به فارسی ترجمه بشه، برای کاهش هزینه و زمان ترجمه و ... بخش عمده از
صفحاتش حذف میشه که دیگه جامع نیست. حالا این اوضاع ترجمه ها است، تألیف های فارسی که جای خود دارند.

مفهوم static در #C با ++C فرق داره، در ++C شما می توانستید در داخل یک تابع متغیر static ای
تعریف کنید تا در همون دفعه اولی که تابع اجرا شد ایجاد بشه و در دفعات بعدی از همون قبلی استفاده بشه و
تا زمانی که شیء کلاس نابود نشده، متغیر هم نابود نشه. یعنی static موجب حفظ شدن مقدار یک متغیر بین
اجرای های مکرر تابع می شد.

اما در #C برای تعریف کردن یک متغیر داخل تابع، کلمه کلیدی static کاربردی نداره. یعنی در #C متغیر های داخل
یک تابع همیشه غیر static اند و نمی توانید برای حفظ کردن مقدار شون از static استفاده کنید. اگر بخواهید
متغیر اینچنینی داشته باشید باید بجای متغیر های محلی تابع، متغیر رو بیرون از بدنه تابع و به عنوان متغیر
محلی کلاس تعریف کنید.

در عوض در #C شما یک متغیر یا تابع یا کلاس یا رخداد یا متد یا عملگر رو static تعریف می کنید. اینطوری اون چیزی
که static تعریف کردید، از شیء ای که می سازید مستقل میشه و همیشه قابل دسترسی است. حتی
زمانی که هنوز شیء ای از اون کلاس نساخته اید توابع و متغیر های static کلاس قابل دسترسی اند.

فرض کنید که در #C یک تابع درون کلاس از نوع static تعریف شده. این تابع دیگه متعلق به اشیاء نیست و جزئی از
بدنه کلاس خواهد بود. یعنی هر شی ای که از اون کلاس می سازید یک تابع مستقل نداره. همه اشیاء از
یک تابع مشترک استفاده می کنند. دقیقا به همین دلیله که کلمه کلیدی this و متغیر های غیر static کلاس
در داخل یک تابع static قابل دسترسی نیستند. چرا؟ چون اون تابع static مستقل از اشیاء کلاس است و اصلا
نمی دونه که شما از طریق کدوم شیء فراخوانی اش کرده اید، در نتیجه this و متغیر های محلی شیء
از دید تابع static وجود ندارند.
 

جدیدترین ارسال ها

بالا