سؤال

هل هناك طريقة سريعة/بسيطة لحساب توزيع التردد لمجموعة .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> عندما يكون عنصر القائمة هو المفتاح والتعدد هو القيمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top