گروه بندی با LINQ در C#
فرض کنید یک کلاس به نام Person
دارید که شامل PersonID
و car
است و یک لیست از این کلاس ایجاد میکنید که ممکن است شامل چندین نمونه با PersonID
یکسان باشد، میتوانید از LINQ برای گروهبندی بر اساس PersonID
و گرفتن لیستی از همه ماشینهایی که هر شخص دارد استفاده کنید.
مثال با استفاده از سینتکس کوئری LINQ
var results = from p in persons
group p.car by p.PersonID into g
select new Result
{
PersonID = g.Key,
cars = g.ToList()
};
در اینجا، persons
بر اساس PersonID
گروهبندی میشود و سپس یک شی جدید از نوع Result
برای هر گروه ایجاد میشود که شامل PersonID
و لیستی از ماشینها (cars
) است.
مثال با استفاده از متد GroupBy
شما همچنین میتوانید از متد GroupBy لیست استفاده کنید:
var results = persons.GroupBy(
p => p.PersonID,
p => p.car,
(key, g) => new Result { PersonID = key, cars = g.ToList() }
);
در اینجا نیز ما با گروهبندی بر اساس PersonID
، لیستی از ماشینها را برای هر PersonID
دریافت میکنیم.
نکات
نکته اول: استفاده از نوع بی نام
تعریف کلاس Result
برای بازگرداندن نتایج الزامی نیست و میتوانید نتیجه را بصورت نوع Anonymous یا بی نام بازگردانید. به عنوان مثال، اگر بخواهید نام شخص را نیز اضافه کنید، میتوانید به صورت زیر عمل کنید:
var results = from p in persons
group p by p.PersonID into g
select new
{
PersonID = g.Key,
Cars = g.ToList(),
Name = g.Select(x => x.Name).FirstOrDefault() // مثال برای اضافه کردن نام
};
نکته دوم: استفاده از LookUp
همچنین، می توانید از قابلیت Lookup
به جای گروه بندی استفاده کنید:
var carsByPersonId = persons.ToLookup(p => p.PersonID, p => p.car);
در این صورت میتوانید ماشینها را برای هر PersonID
به راحتی دریافت کنید.
.