PDA

View Full Version : سوال: مرتب سازی لیست باکس که دارای آیتم های عددی می باشد



dele_ghamgin_2008
سه شنبه 16 دی 1393, 13:27 عصر
سلام. براي اينكه يه ليست باكس رو سورت كنيم (به ترتيب اعداد)، بايد چيكار كنيم؟
از توي msdn فهميدم كلياتش رو ...
اما موقعي كه مي خوايم sort كنيم ، اگه از عدد 1 داشته باشيم تا مثلا 100 ، به اين صورت sort ميشه ::
1
10
11
12
13
14
15
16
17
18
19
2
21
22
23
و الي آخر....


چيكار كنم كه درست بياد اينجوري نمايش بده ::
1
2
3
4
5
6
7
8
9
10
11
12
و ... ؟؟
ممنون از توجهتون...

hsgpro
سه شنبه 16 دی 1393, 13:35 عصر
سلام
ساده ترین راه اینه که اعداد تک رقمی مثل 1 - 2 - 3 و... رو بر اساس تعداد رقم های سایر اعداد به اولش 0 اضافه کنیم.
مثلاً اگه سایر اعدادتون حداکثر سه رقمی هستن این اعداد هم 001 - 002 - 003 و... بنویسید.

dele_ghamgin_2008
سه شنبه 16 دی 1393, 14:23 عصر
سلام
ساده ترین راه اینه که اعداد تک رقمی مثل 1 - 2 - 3 و... رو بر اساس تعداد رقم های سایر اعداد به اولش 0 اضافه کنیم.
مثلاً اگه سایر اعدادتون حداکثر سه رقمی هستن این اعداد هم 001 - 002 - 003 و... بنویسید.

من نمیتونم از قبل یعنی اعداد رو دستکاری کنم . حالا چیکار کنم که آیتم هایی که 1 هست به صورت 001 نمایش داده بشن و بعدش سورت کنم !؟

مطمئنا 99 تا ازین if ها که نمیشه :

if (records[1] == "1") records[1] = "001";


if (records[1] == "2")
records[1] = "002";


if (records[1] == "3")
records[1] = "003";


if (records[1] == "4")
records[1] = "004";


if (records[1] == "5")
records[1] = "005";


if (records[1] == "6")
records[1] = "006";


if (records[1] == "7")
records[1] = "007";


if (records[1] == "8")
records[1] = "008";


if (records[1] == "9")
records[1] = "009";

plus
سه شنبه 16 دی 1393, 14:27 عصر
مرتب سازی داخلی listbox، مرتب سازی بر اساس حروف الفبا هست.برای مرتب سازی عددی باید مقادیر رو درون یک List بریزین، مرتب کنید و دوباره به ListBox برگردونید.
اگه مقادیری که در listbox نگه میدارین عددی (از نوع int، long و...) هستن، اگه خصوصیت sorted رو true کردین به false برگردونید و:

using System.Collections.Generic;
..
..
List<int> list = new List<int>();
foreach (object item in listBox1.Items) {
list.Add((int)item);
}
list.Sort();
listBox1.Items.Clear();
foreach (int item in list) {
listBox1.Items.Add(item);
}

اینجا فرض این بوده که نوع آیتم ها int هست.اگه نوع آیتم های که به ListBox اضافه کردین رشته ای هستن (مثلا مستقم از یک TextBox به لیست اضافه کردین)، باید ابتدا تعیین کنید که داده ها از چه نوعی قراره باشن و بعد با استفاده از متد Parse همون نوع، رشته ها رو به عدد تبدیل کنید.

using System.Collections.Generic;
..
..
List<int> list = new List<int>();
foreach (object item in listBox1.Items) {
string sItem = (string)item ;
int nItem = int.Parse(sItem);
list.Add(nItem);
}
list.Sort();
listBox1.Items.Clear();
foreach (int item in list) {
listBox1.Items.Add(item);
}

ایجا هم فرض بر این بوده که مقادیر قراره از نوع int باشن.

Share & Learn
سه شنبه 16 دی 1393, 14:33 عصر
سلام
این تیکه کد لیست باکس 1 رو مرتب می کنه و نتیجه رو تو لیست باکس 2 نشون می ده
خدمت شما:

var myOtherList = listBox1.Items.Cast<String>().ToList();
var numberList = myOtherList.Select(int.Parse).ToList();
numberList.Sort();
foreach (var item in numberList)
{
listBox2.Items.Add(item);
}

dele_ghamgin_2008
سه شنبه 16 دی 1393, 14:48 عصر
مرتب سازی داخلی listbox، مرتب سازی بر اساس حروف الفبا هست.برای مرتب سازی عددی باید مقادیر رو درون یک List بریزین، مرتب کنید و دوباره به ListBox برگردونید.
اگه مقادیری که در listbox نگه میدارین عددی (از نوع int، long و...) هستن، اگه خصوصیت sorted رو true کردین به false برگردونید و:

using System.Collections.Generic;
..
..
List<int> list = new List<int>();
foreach (object item in listBox1.Items) {
list.Add((int)item);
}
list.Sort();
listBox1.Items.Clear();
foreach (int item in list) {
listBox1.Items.Add(item);
}

اینجا فرض این بوده که نوع آیتم ها int هست.اگه نوع آیتم های که به ListBox اضافه کردین رشته ای هستن (مثلا مستقم از یک TextBox به لیست اضافه کردین)، باید ابتدا تعیین کنید که داده ها از چه نوعی قراره باشن و بعد با استفاده از متد Parse همون نوع، رشته ها رو به عدد تبدیل کنید.

using System.Collections.Generic;
..
..
List<int> list = new List<int>();
foreach (object item in listBox1.Items) {
string sItem = (string)sItem;
int nItem = int.Parse(sItem);
list.Add(nItem);
}
list.Sort();
listBox1.Items.Clear();
foreach (int item in list) {
listBox1.Items.Add(item);
}

ایجا هم فرض بر این بوده که مقادیر قراره از نوع int باشن.

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

string sItem = (string)sItem;

و لیست آیتم های من :

7 - انواع فشارسنج جیوه ای
15 - تجهیزات پزشکی ارتوپدی
4 - تجهیزات پزشکی پوست
5 - تجهیزات پزشکی تخصصی
5 - تجهیزات پزشکی مورد نیاز
89 - خرید تجهیزات پزشکی
8 - خرید فشارسنج دیجیتالی
2 - درمان سرطان خون
2 - روانشناسی جنسیت
2 - روانشناسی جنسیتی
3 - روانشناسی نقاشی کودک
1 - طب سنتی درمان
14 - فروش انواع فشارسنج
2 - فروش فشار سنج دیجیتالی
8 - فروش فشارسنج جیوه ای
6 - فروش فشارسنج عقربه ای
2 - فشار سنج بازویی

dele_ghamgin_2008
سه شنبه 16 دی 1393, 14:51 عصر
سلام
این تیکه کد لیست باکس 1 رو مرتب می کنه و نتیجه رو تو لیست باکس 2 نشون می ده
خدمت شما:

var myOtherList = listBox1.Items.Cast<String>().ToList();
var numberList = myOtherList.Select(int.Parse).ToList();
numberList.Sort();
foreach (var item in numberList)
{
listBox2.Items.Add(item);
}


آیتم های من فقط عدد نیستند . بلکه با عدد شروع می شوند و من هم می خواهم بر اساس شروع آیتم که با عدد می باشد سورت کند .

plus
سه شنبه 16 دی 1393, 15:05 عصر
آیتم های لیست باکس من فقط عدد نیست . عدد + رشته هستن . دستور شما در این خط خطا میشه و اجرا نمیشه

string sItem = (string)sItem;

و لیست آیتم های من :

7 - انواع فشارسنج جیوه ای
15 - تجهیزات پزشکی ارتوپدی
4 - تجهیزات پزشکی پوست
5 - تجهیزات پزشکی تخصصی
5 - تجهیزات پزشکی مورد نیاز
89 - خرید تجهیزات پزشکی
8 - خرید فشارسنج دیجیتالی
2 - درمان سرطان خون
2 - روانشناسی جنسیت
2 - روانشناسی جنسیتی
3 - روانشناسی نقاشی کودک
1 - طب سنتی درمان
14 - فروش انواع فشارسنج
2 - فروش فشار سنج دیجیتالی
8 - فروش فشارسنج جیوه ای
6 - فروش فشارسنج عقربه ای
2 - فشار سنج بازویی

باید برای لیست مقایسه کننده سفارشی ایجاد کنید:

class CustomComparer : IComparer<string> {
#region IComparer<string> Members
public int Compare(string x, string y) {
StringBuilder sbX = new StringBuilder();
foreach (char ch in x) {
if (!char.IsDigit(ch)) {
break;
}
sbX.Append(ch);
}
string sX = sbX.ToString();
StringBuilder sbY = new StringBuilder();
foreach (char ch in y) {
if (!char.IsDigit(ch)) {
break;
}
sbY.Append(ch);
}
string sY = sbY.ToString();
bool hasX = !string.IsNullOrEmpty(sX);
bool hasY = !string.IsNullOrEmpty(sY);
if (!hasX && !hasY) {
return 0;
}
if (!hasX) {
return -1;
}
if (!hasY) {
return 1;
}
long nX = long.Parse(sX);
long nY = long.Parse(sY);
return nX.CompareTo(nY);
}
#endregion
}
..
..
private void Form_Load(object sender, EventArgs e) {
List<string> list = new List<string>();
foreach (object item in listBox1.Items) {
string sItem = (string)item;
list.Add(sItem);
}
list.Sort(new CustomComparer());
listBox1.Items.Clear();
foreach (string item in list) {
listBox1.Items.Add(item);
}
}

و مشخصه Sorted حتما برابر false باشه.

dele_ghamgin_2008
سه شنبه 16 دی 1393, 17:49 عصر
باید برای لیست مقایسه کننده سفارشی ایجاد کنید:

و مشخصه Sorted حتما برابر false باشه.

اصلا متوجه نشدم که باید چه کنم !!!
:گریه: