حساب توزيع التردد لمجموعة مع .NET/C#
-
22-09-2019 - |
سؤال
هل هناك طريقة سريعة/بسيطة لحساب توزيع التردد لمجموعة .NET باستخدام LINQ أو غير ذلك؟
على سبيل المثال: تحتوي قائمة طويلة بشكل تعسفي على العديد من التكرار. ما هي الطريقة الذكية للمشي في القائمة وتكرار العد/تتبع؟
المحلول
أسهل طريقة هي استخدام hashmap وإما استخدام القيمة كمفتاح وزيادة القيمة ، أو اختيار حجم دلو (دلو 1 = 1 - 10 ، دلو 2 = 11 - 20 ، إلخ) ، وزيادة كل دلو بواسطة القيمة.
ثم يمكنك المرور وتحديد الترددات.
نصائح أخرى
إن أبسط طريقة للعثور على العناصر المكررة في القائمة هي تجميعها ، مثل هذا:
var dups = list.GroupBy(i => i).Where(g => g.Skip(1).Any());
(جاري الكتابة Skip(1).Any()
يجب أن تكون أسرع من (count ()> 1) لأنه لن يضطر إلى اجتياز أكثر من عنصرين من كل مجموعة. ومع ذلك ، ربما يكون الفرق ضئيلًا إلا إذا list
العداد البطيء)
ال مكتبة المجموعات العامة C5 لديه HashBag
التنفيذ الذي يقبل التكرارات عن طريق العد. سوف يحصل لك الرمز الزائف التالي على ما تبحث عنه:
var hash = new HashBag(); hash.AddAll(list); var mults = hash.ItemMultiplicities();
(أين K
هو نوع العناصر في قائمتك) mults
سوف تحتوي بعد ذلك على IDictionary<K,int>
عندما يكون عنصر القائمة هو المفتاح والتعدد هو القيمة.