PDA

View Full Version : جستجو در یک List<T> object



Mrs.Net
جمعه 13 اردیبهشت 1387, 12:33 عصر
یک کلاس دارم (فرض کلاس اشخاص) که به
List<T> یک لیست از آنها ساختم.
حالا میخوام شخصی که کد خاصی داره پیدا کنم
غیر از foreach چجوری اینکار بکنم؟
گزینه های Find یا IndexOf چجوری کار میکنند؟

hassan razavi
جمعه 13 اردیبهشت 1387, 13:07 عصر
بهترین راه استفاده از LINQ هستش. ولی اگه می خواهید از foreach استفاده کنید :


foreach(int id in mylist.ID)
...

رضا عربلو
جمعه 13 اردیبهشت 1387, 13:12 عصر
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class person
{
public string name;
}
class Program
{
public static bool Findperson(person p)
{
if (p.name == "©àں")
{
returntrue;
}
else
{
return false;
};
}
static void Main(string[] args)
{
List<person> myList = newList<person>(5);
myList.Add(new person());
Predicate<person> pDel = newPredicate<person>(Findperson);
var Search = myList.Find(pDel);
یا
var mySearchResult2 = from person in myList where person.name=="©àں"select person;
}
}
}

Mrs.Net
جمعه 13 اردیبهشت 1387, 14:33 عصر
بهترین راه استفاده از LINQ هستش.با 2005 کار میکنم. (مگه تو 2005 میشه از LINQ استفاده کرد؟)

ولی اگه می خواهید از foreach استفاده کنید اما گفتم به غیر از foreach

آقای عربلو این "©àں" باید متغیر باشه و از من بگیره. اما تو کد شما ثابته

رضا عربلو
جمعه 13 اردیبهشت 1387, 16:15 عصر
در بالا دو روش را بیان کردم
1- با استفاده از متد find (برای دات نت 2.0 به بالا)
برای اینکه مقدار داینامیک سرچ بکنیم راه حل های خیلی مختلف است یکی از ساده ترین هاش استفاده از یک Static Member است.


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

namespace ConsoleApplication1
{
class person
{
public static string SearchString;

public string name;
}
class Program
{
public static bool FindPerson(person p)
{
if (p.name == person.SearchString)
{
return true;
}
else
{
return false;
};
}
static void Main(string[] args)
{
List<person> myList = new List<person>(5);
myList.Add(new person());
Predicate<person> pDel = new Predicate<person>(Findperson);
var Search = myList.Find(pDel);
}
}
}

2- با استفاده از LINQ (برای دات نت فریم ورک 3.0 به بالا که می توان بر روی VS2005 نیز نصب کرد : تا اون جایی که یادمه نسخه CTP اش بود نمی دونم برای vs2005 نسخه فاینالش اومده یا نه؟ http://www.microsoft.com/downloads/details.aspx?FamilyId=1E902C21-340C-4D13-9F04-70EB5E3DCEEA&displaylang=en)


var mySearchResult2 = fromperson p2 in myList where p2.name == "©…ں"select p2;

Mrs.Net
جمعه 13 اردیبهشت 1387, 16:29 عصر
تو کد اول شما میخوام شخصی با کد 23 پیدا کنم چه خطی باید بنویسم؟


برای Linq اون برنامه که نصب میکنم آیا با فریم ورک 2 کار میکنه یا باید 3 نصب باشه؟!

رضا عربلو
جمعه 13 اردیبهشت 1387, 21:17 عصر
برای پیدا کردن شخصی با کد 23 قبل از Find بنویس :
نام_کلاس.نام_Member_استاتیک = 23 ;
یعنی


Person.Code = 23;


البته نمی دونم Anonymouse Method ها را دات نت 2.0 ساپورت می کند یا نه ولی می توانی از متدهای گمنام استفاده کنی و بنویسی :


string s = "";
List<person> myList = newList<person>(5);
myList.Add(newperson());
Predicate<person> pDel = delegate(person p)
{
if (p.name == s)
{
returntrue;
}
else
{
returnfalse;
};
};
var Search = myList.Find(pDel);



برای اون Linq هم بایستی دات نت 3.0 یا 3.5 نصب شده باشده باشد.

رضا عربلو
جمعه 13 اردیبهشت 1387, 21:18 عصر
برای اون Linq هم بایستی دات نت 3.0 یا 3.5 نصب شده باشده باشد.