PDA

View Full Version : سوال: ساخت لیستی از افراد بر حسب عدد مربوطه



دلتنگ اسمان
پنج شنبه 21 آذر 1392, 12:12 عصر
سلام
طبق تصویر زیر میخوام افرادی رو که اعداد مساوی دارن در یک لیست قرار بدم.
البته تعداد افراد همیشه ثابت نیست بلکه کم و زیاد داره.
اعداد مربوط به افراد هم بین 0 تا 20 متغیره.
اگه بشه اینها رو در یه hashtabel قرار داد و بر حسب اعداد نزولی به صعودی sort کرد با حفظ افراد متناظر با همون اعداد که چه بهتر.اگه نشه هر کدوم از این اعداد برابر را همراه با افراد متناظر در یه لیست قرار بدم. ممنون
113822

Mahmoud.Afrad
پنج شنبه 21 آذر 1392, 17:44 عصر
این داده ها توی چی ذخیره میشن؟ دیتاتیبل، لیست و ... ؟

rahnema1
جمعه 22 آذر 1392, 01:54 صبح
شما می تونید از روی جدول یک دیکشنری خاص ایجاد کنید که کلید اون شماره افراد و مقدار متناظر با کلید لیستی از افرادی باشه که اون شماره را دارند بعدش هم همین طور که اعضا از جدول حذف یا به اون اضافه میشن شما باید به دیکشنری حذف یا اضافه کنید یه چیزی شبیه این البته توی این کد فقط در دیکشنری تغیی داده میشه تغییرات جدول را خودتون اعمال می کنید.



using System;
using System.Linq;
using System.Data;
using System.Collections.Generic;
namespace barnamlookpdiccs
{
class jad
{
public int id { get; set; }
public string nam { get; set; }
}
class Program
{
public static Dictionary<int, List<string>> CreateDic(List<jad> jadval)
{
var look=jadval.ToLookup(x=>x.id,x=>x.nam);
Dictionary<int, List<string>> dic = new Dictionary<int, List<string>>();
foreach (var element in look) dic.Add(element.Key,element.OrderBy(i=>i).ToList());
return dic;
}
public static void InsertMember(Dictionary<int, List<string>> dic,int id,string name)
{
if(!dic.ContainsKey(id)) dic.Add(id,new List<string>());
int index=dic[id].BinarySearch(name);
dic[id].Insert((index<0?~index:index),name);
}
public static void RemoveMember(Dictionary<int, List<string>> dic,int id,string name)
{
dic[id].Remove(name);
}
public static void Main(string[] args)
{
List<jad> jadval=new List<jad>{
new jad{id=1,nam="Mahdi"}
,new jad{id=2,nam="Javad"}
,new jad{id=3,nam="Gholamreza"}
,new jad{id=1,nam="Mehrdad"}
,new jad{id=4,nam="Mostafa"}
,new jad{id=3,nam="Danial"}
,new jad{id=5,nam="Amir"}
,new jad{id=2,nam="Mohsen"}
,new jad{id=2,nam="Maryam"}
,new jad{id=2,nam="Mohammad"}
,new jad{id=3,nam="Fateme"}
,new jad{id=3,nam="Nasrin"}};
Dictionary<int, List<string>> dic=CreateDic(jadval);
InsertMember(dic,1,"Hassan");
RemoveMember(dic,1,"Mahdi");
foreach (var element in dic) {
Console.Write("\n{0}:=",element.Key.ToString());
foreach (var names in element.Value) {
Console.Write(names+",");
}
}

Console.Write("\n\nPress any key to continue . . . ");
Console.ReadKey(true);
}
}
}

دلتنگ اسمان
جمعه 22 آذر 1392, 11:17 صبح
این داده ها توی چی ذخیره میشن؟ دیتاتیبل، لیست و ... ؟
اینها در یه hashtabel هستن. کلید اصلی فامیلی افراده.
یعنی یه کلاسی یا شیئی که به این صورت باشه و فقط بر حسب اعداد اون رو sortکرد وجود نداره؟(به شرطی که افراد متناظر با اون عدد حفظ بشن).بعید میدونم مایکروسافت برای همچین چیزی کلاسی نداشته باشه. خود hashtabel رو نمیشه بر اساس اعداد مرتب کرد؟ اگه نشه مجبورم از همین کلاسی که جناب rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) لطف کردن و نوشتن استفاده کنم.بنده دنبال یه راه ساده تر هستم.

plus
جمعه 22 آذر 1392, 19:01 عصر
شما میتونی از یک SortedDictionary (http://msdn.microsoft.com/en-us/library/f7fta44c.aspx)استفاده کنی.البته مبنای Sort به صورت پیشفرض در این کلاس، کلید هست ولی شما میخوای بر اساس مقدار غیر کلیک Sort کنی باید یک کلاس که IIComparer رو پیاده کرده تعریف کنی تا Sort بر اساس عدد انجام بشه.
راه دیگه این هست که شما یک کلاس مثل Item تعریف کنی و این کلاس، IComparable رو پیاده کنه.در این حالت، شما میتونی با ساختن لیستی از ای آیتم ها، متد Sort رو فراخوانی کنی:

class Item : IComparable<Item>
{
int number;
string name;
string family;

public Item(int Number, string Name, string Family)
{
this.number = Number;
this.name = Name;
this.family = Family;
}

public int Number
{
get { return this.number; }
}

public string Name
{
get { return this.name; }
}

public string Family
{
get { return this.family; }
}

public int CompareTo(Item itemToCompare)
{
// A null value means that this object is greater.
if (itemToCompare == null)
return 1;

return this.number.CompareTo(itemToCompare.number);
}
}
..
..
..
private void button1_Click(object sender, EventArgs e)
{
Item[] items = new Item[]
{
new Item(2, "Name1", "Family1"),
new Item(12, "Name2", "Family2"),
new Item(4, "Name3", "Family3"),
new Item(5, "Name4", "Family4"),
new Item(8, "Name5", "Family5"),
new Item(4, "Name6", "Family6"),
new Item(20, "Name7", "Family7"),
new Item(2, "Name8", "Family8"),
};
List<Item> listItems = items.ToList();
listItems.Sort();


}

البته توجه کنید که اینجا دیگه از HashTable استفاده نمیشه و بحث کلید کلا بررسی نمیشه.

دلتنگ اسمان
جمعه 22 آذر 1392, 20:19 عصر
این قطعه کد رو هم پیدا کردم:

private string[] getKeysInValueOrder(Hashtable arrayToSort)
{
string[] keys = new string[arrayToSort.Count];
arrayToSort.Keys.CopyTo(keys, 0);

Array.Sort(keys, delegate(string x, string y)
{
return (arrayToSort[x].ToString() as IComparable).CompareTo(arrayToSort[y].ToString());
}
);

return keys;
}
از همه ممنونم.