PDA

View Full Version : مرتب کردن آرایه



prince-of-persia
پنج شنبه 14 شهریور 1387, 12:50 عصر
سلام

من یک آرایه string دارم که داخلش مقادیری مثل
cha50
cha32
cha100

وقتی که اونو مرتب می کنم به صورت
cha100
cha32
cha50
بر میگردونه در صورتی که مرتب کردن به صورت صعودی باید به شکل
cha32
cha50
cha100
یعنی برای مرتب کردن طول رشته رو هم در نظر بگیره و بعد کاراکتر ها رو با هم مقایسه کنه

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

Array.Sort(ArrFile);

حالا باید چطور بنویسم که درست مرتب کنه ؟

با تشکر

رضا عربلو
پنج شنبه 14 شهریور 1387, 13:47 عصر
می توانی اینترفیس System.Collections.IComparer را پیاده سازی کنی


class Program
{
static void Main(string[] args)
{
string[] cArray = new string[5];

Array.Sort(cArray, StringComparer);
}
static int StringComparer(object a, object b)
{
string stra = (a as string).Remove(0, 3);
string strb = (b as string).Remove(0, 3);
return string.Compare(stra, strb);
}
}

prince-of-persia
پنج شنبه 14 شهریور 1387, 14:17 عصر
ای بابا چقدر خفن
تقریبا هیچی نفهمیدم میشه یکم توضیح بدید System.Collections.IComparer

و اینکه کد شما مخصوصا تابع StringComparer داره چیکار میکنه ؟

البته من نوشتم اما

Array.Sort(cArray, StringComparer);
خطا داره

The best overloaded method match for 'System.Array.Sort(System.Array, System.Array)' has some invalid arguments
Argument '2': cannot convert from 'method group' to 'System.Array'

رضا عربلو
پنج شنبه 14 شهریور 1387, 20:14 عصر
یکی از overload های متد سورت به شکل
public static void Sort(Array array, IComparer comparer);
است:
این هم مثال کامل که اجرل می شود.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] cArray = new string[5]{"Cha3123", "Cha1234", "Cha1243", "Cha34", "Cha53"};
Array.Sort(cArray, StringComparer);
foreach (string s in cArray)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
static int StringComparer(object a, object b)
{
int stra = Convert.ToInt32((a as string).Remove(0, 3));
int strb = Convert.ToInt32((b as string).Remove(0, 3));
return stra - strb;
}
}
}

prince-of-persia
جمعه 15 شهریور 1387, 12:22 عصر
ببخشید مقادیری که توی آرایه هستند رو اشتباه گفتم.

"C:\\Documents and Settings\\Administrator\\Desktop\\CHARS\\ch\\36B.p ng"
"C:\\Documents and Settings\\Administrator\\Desktop\\CHARS\\ch\\306B. png"
"C:\\Documents and Settings\\Administrator\\Desktop\\CHARS\\ch\\50B.p ng

در واقع منم میخوام آرایه ایی که داخلش یک سری آدرس فایل هست رو مثل arrange by name ویندوز مرتب کنم

رضا عربلو
جمعه 15 شهریور 1387, 18:10 عصر
شما بایستی تابع را طوری بنویسی که اونتوری که می خواهید تشخیص بدهد چه رشته ای از چه رشته ای بزرگتر است. یعنی
اگر a بزگتر از b بود یک مقدار بزرگتر از صفر
اگر a با b مساوی بود مقدار صفر
و اگر a کوچکتر از b بود مقدار منفی برگرداند.

ariashop
چهارشنبه 11 دی 1387, 16:05 عصر
من می خوام همین برنامه رو با برنامه خودم ترکیب کنم تا به این جواب برسم
می خوام 3 تا کارمند بگیره مشخصاتش رو بعد بگه کی بیشترین حقوق رو داره و کی کمترین حقوق رو بعد یکبار هم حقوق رو از کم به زیاد یا از زیاد به کم مرتب کنه
ممنون اگر کسی برنامه نهایی رو بتونه اوکی کنه




using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication54
{
struct human
{

public string name;
public int age;
public int ID;
private int salary;
public void Staff()
{
Console.WriteLine("enter your name");
name = Console.ReadLine();
Console.WriteLine("enter your age : ");
age = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("enter your ID:");
ID = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("enter your salary:");
salary = Convert.ToInt32(Console.ReadLine());
}



class Program
{
static void Main(string[] args)
{
string[] cArray = new string[5] { "Cha3123", "Cha1234", "Cha1243", "Cha34", "Cha53" };
Array.Sort(cArray, StringComparer);
foreach (string s in cArray)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
static int StringComparer(object a, object b)
{
int stra = Convert.ToInt32((a as string).Remove(0, 3));
int strb = Convert.ToInt32((b as string).Remove(0, 3));
return stra - strb;
}
}
}
}