مرتب سازی لیست

bitaroos

Member
(زبان برنامه نویسی C#.net)

سلام

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

7az2b00i1lhjn89bz5b1.jpg


حالا می خوام بر حسب x یا area یا ... مرتب سازیش کنم.

تو اینترنت گشتم و لینک زیر رو پیدا کردم، ولی توی لینک زیر یک کلاس ساخته و ... خودتون ببینید!
http://www.developerfusion.com/code/5513/sorting-and-searching-using-c-lists/
ولی من کلاس نساختم و تو یک حلقه به شکل زیر، مقدار دهی رو انجام دادم

کد:
RawDatas.Add(new float[4] { X,Y, Area, Height });

حالا من چطوری می تونم لیستم رو sort کنم؟؟؟
(می خوام از یه روش شبیه به لینکی که گذاشتم استفاده کنم و نمی خوام خودم حلقه تو در تو بنویسم)

ممنون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
(زبان برنامه نویسی C#.net)

سلام

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

7az2b00i1lhjn89bz5b1.jpg


حالا می خوام بر حسب x یا area یا ... مرتب سازیش کنم.

تو اینترنت گشتم و لینک زیر رو پیدا کردم، ولی توی لینک زیر یک کلاس ساخته و ... خودتون ببینید!
http://www.developerfusion.com/code/5513/sorting-and-searching-using-c-lists/
ولی من کلاس نساختم و تو یک حلقه به شکل زیر، مقدار دهی رو انجام دادم

کد:
RawDatas.Add(new float[4] { X,Y, Area, Height });

حالا من چطوری می تونم لیستم رو sort کنم؟؟؟
(می خوام از یه روش شبیه به لینکی که گذاشتم استفاده کنم و نمی خوام خودم حلقه تو در تو بنویسم)

ممنون

حقیقتا اون مثال کار درستی انجام داده، اگه ستون های داده ای شما مشخص باشند بهتره که بجای آرایه براشون کلاس داشته باشید اما به هر حال
شما باید اول یک کلاس Comparer بسازید که بدونه چطور باید دو تا آیتم در اون List با هم مقایسه بشه (بتونه مشخص کنه که بین دو []float کدوم یکی بزرگتره)
کد:
        class RawDataComparer : IComparer<float[]>
        {
            private int _sortIndex;

            public RawDataComparer(int sortIndex)
            {
                _sortIndex = sortIndex;
            }

            public int Compare(float[] x, float[] y)
            {
                float value = x[_sortIndex] - y[_sortIndex];
                for (int i = 0; i <= x.Length; i++)
                {
                    if (value < 0)
                        return -1;
                    if (value > 0)
                        return 1;
                    if (i < x.Length)
                        value = x[i] - y[i];
                }
                return 0;
            }
        }
موقعی که از این کلاس یک شی می سازید مشخص می کنید که مقایسه بر اساس کدوم ستون (اندیس آرایه) انجام میشه، اگر در دو آیتم اون ستون مقدارشون
مساوی نبود که هیچ، وگرنه بر اساس بقیه ستون ها (به ترتیب اندیس) مقایسه رو انجام میده.

مثلا مرتب سازی بر اساس ستون اندیس 2
کد:
            List<float[]> RawDatas = new List<float[]>();
            RawDatas.Sort(new RawDataComparer(2));

یک مثال عملی (کامل) :
کد:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        class RawDataComparer : IComparer<float[]>
        {
            private int _sortIndex;

            public RawDataComparer(int sortIndex)
            {
                _sortIndex = sortIndex;
            }

            public int Compare(float[] x, float[] y)
            {
                float value = x[_sortIndex] - y[_sortIndex];
                for (int i = 0; i <= x.Length; i++)
                {
                    if (value < 0)
                        return -1;
                    if (value > 0)
                        return 1;
                    if (i < x.Length)
                        value = x[i] - y[i];
                }
                return 0;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<float[]> RawDatas = new List<float[]>();
            RawDatas.Sort(new RawDataComparer(2));

            RawDatas.Add(new float[] { 23, 5, 56, 12 });
            RawDatas.Add(new float[] { 13, 8, 52, 15 });
            RawDatas.Add(new float[] { 1, 2, 3, 4 });
            RawDatas.Add(new float[] { 9, 10, 11, 12 });
            RawDatas.Add(new float[] { 5, 6, 7, 8 });

            StringBuilder text = new StringBuilder();

            RawDatas.Sort(new RawDataComparer(0));
            text.AppendLine(RawDatasToString(RawDatas));

            RawDatas.Sort(new RawDataComparer(1));
            text.AppendLine(RawDatasToString(RawDatas));

            RawDatas.Sort(new RawDataComparer(2));
            text.AppendLine(RawDatasToString(RawDatas));

            RawDatas.Sort(new RawDataComparer(3));
            text.AppendLine(RawDatasToString(RawDatas));

            MessageBox.Show(text.ToString());
        }

        private string RawDatasToString(List<float[]> RawDatas)
        {
            StringBuilder text = new StringBuilder();
            foreach (float[] item in RawDatas)
            {
                foreach (float value in item)
                    text.Append(value.ToString() + "\t");
                text.AppendLine();
            }
            return text.ToString();
        }
    }
 

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

بالا