سؤال

هل هناك طريقة بسيطة لحساب عدد تكرارات جميع عناصر القائمة في تلك القائمة نفسها في C #؟

شيء من هذا القبيل:

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

string Occur;
List<string> Words = new List<string>();
List<string> Occurrences = new List<string>();

// ~170 elements added. . . 

for (int i = 0;i<Words.Count;i++){
    Words = Words.Distinct().ToList();
    for (int ii = 0;ii<Words.Count;ii++){Occur = new Regex(Words[ii]).Matches(Words[]).Count;}
         Occurrences.Add (Occur);
         Console.Write("{0} ({1}), ", Words[i], Occurrences[i]);
    }
}
هل كانت مفيدة؟

المحلول

ماذا عن شيء مثل هذا ...

var l1 = new List<int>() { 1,2,3,4,5,2,2,2,4,4,4,1 };

var g = l1.GroupBy( i => i );

foreach( var grp in g )
{
  Console.WriteLine( "{0} {1}", grp.Key, grp.Count() );
}

تحرير لكل تعليق: سأحاول القيام بهذه العدالة. :)

في مثالي، إنه Func<int, TKey> لأن قائمتي هي ITS. لذلك، أنا أقول Groupby كيفية تجميع البنود الخاصة بي. يستغرق Func Int ويعود مفتاح Grouping الخاص بي. في هذه الحالة، سأحصل على IGrouping<int,int> (مجموعة من Ints Keyed INT). إذا غيرت ذلك إلى (i => i.ToString() ) على سبيل المثال، سأكون مقاومة تجمع بلدي بواسطة سلسلة. يمكنك أن تتخيل مثالا أقل تافهة من المفاتيح عن طريق "1"، "2"، "3"، ربما أقوم بدالة تعود "واحد"، "اثنين"، "ثلاثة" ليكون مفاتيح بلدي ...

private string SampleMethod( int i )
{
  // magically return "One" if i == 1, "Two" if i == 2, etc.
}

لذلك، هذا هو مؤسسة من شأنها أن تأخذ int وإرجاع سلسلة، تماما مثل ...

i =>  // magically return "One" if i == 1, "Two" if i == 2, etc. 

ولكن نظرا، نظرا لأن السؤال الأصلي دعا إلى معرفة قيمة القائمة الأصلية، فهي تعتمد، لقد استخدمت عددا صحيحا للتو مفتاح إجمالتي العددية لجعل مثالي أبسط.

نصائح أخرى

var wordCount =
    from word in words
    group word by word into g
    select new { g.Key, Count = g.Count() };    

هذا مأخوذ من إحدى الأمثلة في LinQPad

يمكنك أن تفعل شيئا كهذا لكسب من قائمة الأشياء.

IList<String> names = new List<string>() { "ToString", "Format" };
IEnumerable<String> methodNames = typeof(String).GetMethods().Select(x => x.Name);

int count = methodNames.Where(x => names.Contains(x)).Count();

لحساب عنصر واحد

string occur = "Test1";
IList<String> words = new List<string>() {"Test1","Test2","Test3","Test1"};

int count = words.Where(x => x.Equals(occur)).Count();

الحلقة الخارجية الخاصة بك هي حلقات على كل الكلمات في القائمة. انها غير ضرورية وسوف تسبب لك مشاكل. إزالته وينبغي أن تعمل بشكل صحيح.

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