04-09-20, 10:41 PM
اعتذر اخي الكريم منك ، كل ما مطلوب تغييره هو الدالة OrderByDescending بدلا من OrderBy للترتيب تنازلي بلا من تصاعدي
جربتها وعملت كما تريد
وشرحها بسيط :
AsEnumerable : لتحويل الداتا تابل الى قابل للعد ( List مثلا ) لنتمكن من استخدام Linq عليها
Skip(1) : تخطي اول عنصر ، فيه اسماء الاعمدة من اكسيل
GroupBy(Function(x) x(0)) : تجميع العناصر الى مجموعات حسب اول عمود ( اسم الصنف ) ، يستخدم اجراء لمدا لاعادة عناصر العمود الاول
SelectMany : نخبر Linq ان يفعل ما نريد بكل مجموعة ومن ثم يقوم بتجميع الناتج في List واحدة ، وما نقوم بفعله هو :
OrderByDescending(Function(y) y(1)) : ترتيب عناصر كل مجموعة تنازليا حسب عناصر العمود الثاني
Take(3) اخذ اول 3 عناصر او اقل من كل مجموعة
CopyToDataTable : يحفظ الناتج الى داتا تيبل جديد
انصحك بالتعمق في LINQ فهيا الحل في معظم الامور اذا كنت تتعامل مع البيانات كثيرا ، مايتطلب الكثير من الاسطر لعمله يكفي سطر واحد من هذه التقنيه لفعل نفس الشيء
كود :
DataGridView1.Columns.Clear()
DataGridView1.DataSource = dt.
AsEnumerable.
Skip(1).
GroupBy(Function(x) x(0)).
SelectMany(Function(x) x.OrderByDescending(Function(y) y(1)).Take(3)).
CopyToDataTableجربتها وعملت كما تريد
وشرحها بسيط :
AsEnumerable : لتحويل الداتا تابل الى قابل للعد ( List مثلا ) لنتمكن من استخدام Linq عليها
Skip(1) : تخطي اول عنصر ، فيه اسماء الاعمدة من اكسيل
GroupBy(Function(x) x(0)) : تجميع العناصر الى مجموعات حسب اول عمود ( اسم الصنف ) ، يستخدم اجراء لمدا لاعادة عناصر العمود الاول
SelectMany : نخبر Linq ان يفعل ما نريد بكل مجموعة ومن ثم يقوم بتجميع الناتج في List واحدة ، وما نقوم بفعله هو :
OrderByDescending(Function(y) y(1)) : ترتيب عناصر كل مجموعة تنازليا حسب عناصر العمود الثاني
Take(3) اخذ اول 3 عناصر او اقل من كل مجموعة
CopyToDataTable : يحفظ الناتج الى داتا تيبل جديد
انصحك بالتعمق في LINQ فهيا الحل في معظم الامور اذا كنت تتعامل مع البيانات كثيرا ، مايتطلب الكثير من الاسطر لعمله يكفي سطر واحد من هذه التقنيه لفعل نفس الشيء

