فرض کنید یکسری کاراکتر در یک رشته مثل زیر داریم :
“abbbbccd”
حرف b بیشترین تکرار را دارد.حال چگونه می توانیم همین کاراکتری که بیشترین تکرار را دارد پیدا کنیم ؟
روش اول
می توانید از قطعه کد زیر استفاده کنید :
قطعه کدی که در زیر مشاهده می کنید توسط برنامه کامپایلر به جهت تست آزمایش شده و خروجی صحیح مدنظر را بدست آورد.
input.GroupBy(x => x).OrderByDescending(x => x.Count()).First().Key
اگر برای کار بر روی نسخه های قدیمی (2.0) .Net به این قطعه کد نیاز دارید از LinqBridge استفاده کنید.
روش دوم
Dictionary<char, int> dict = new Dictionary<char, int>(); int max = 0; foreach (char c in "abbbbccccd") { int i; dict.TryGetValue(c, out i); i++; if (i > max) { max = i; } dict[c] = i; } foreach (KeyValuePair<char, int> chars in dict) { if (chars.Value == max) { Console.WriteLine("{0}: {1}", chars.Key, chars.Value); } }
این قطعه کد برای نسخه LINQ.کاراکترهای زوج را استخراج می کند (aaaabbbb == a, b).و همچنین اگر str == String.Empty باشد کار نمی کند.
var str = "abbbbccccd"; var res = str.GroupBy(p => p).Select(p => new { Count = p.Count(), Char = p.Key }).GroupBy(p => p.Count, p => p.Char).OrderByDescending(p => p.Key).First(); foreach (var r in res) { Console.WriteLine("{0}: {1}", res.Key, r); }
روش سوم
این قطعه کد نیاز به تست کردن دارد
string testString = "abbbbccd"; var charGroups = (from c in testString group c by c into g select new { c = g.Key, count = g.Count(), }).OrderByDescending(c => c.count); foreach (var group in charGroups) { Console.WriteLine(group.c + ": " + group.count); }
روش چهارم
public static IEnumerable<T> Mode<T>(this IEnumerable<T> input) { var dict = input.ToLookup(x => x); if (dict.Count == 0) return Enumerable.Empty<T>(); var maxCount = dict.Max(x => x.Count()); return dict.Where(x => x.Count() == maxCount).Select(x => x.Key); } var modes = "".Mode().ToArray(); //returns { } var modes = "abc".Mode().ToArray(); //returns { a, b, c } var modes = "aabc".Mode().ToArray(); //returns { a } var modes = "aabbc".Mode().ToArray(); //returns { a, b }
روش پنجم
اگر از متن های بلند استفاده می کنید این کد بهینه تر است و زمان کمتری می گیرد.ولی باز نیاز به تست کردن دارد :
public static IEnumerable<T> Mode<T>( this IEnumerable<T> source, IEqualityComparer<T> comparer = null) { var counts = source.GroupBy(t => t, comparer) .Select(g => new { g.Key, Count = g.Count() }) .ToList(); if (counts.Count == 0) { return Enumerable.Empty<T>(); } var maxes = new List<int>(5); int maxCount = 1; for (var i = 0; i < counts.Count; i++) { if (counts[i].Count < maxCount) { continue; } if (counts[i].Count > maxCount) { maxes.Clear(); maxCount = counts[i].Count; } maxes.Add(i); } return maxes.Select(i => counts[i].Key); }
روش ششم
public char MostOccurringCharInString(string charString) { int mostOccurrence = -1; char mostOccurringChar = ' '; foreach (char currentChar in charString) { int foundCharOccreence = 0; foreach (char charToBeMatch in charString) { if (currentChar == charToBeMatch) foundCharOccreence++; } if (mostOccurrence < foundCharOccreence) { mostOccurrence = foundCharOccreence; mostOccurringChar = currentChar; } } return mostOccurringChar; }
روش هفتم
private static void CalculateMaxCharCountUsingArray(string actualString) { char[] charArray = actualString.ToCharArray(); int[] arr = new int[256]; int maxCount = 0; char maxChar = ' '; foreach (var r in charArray) { arr[r] = arr[r] + 1; if (maxCount < arr[r]) { maxCount = arr[r]; maxChar = r; } } Console.WriteLine("This character " + maxChar + " that appeared maximum times : " + maxCount); IEnumerable<char> distinctCharArray = charArray.Distinct(); foreach(var r in distinctCharArray) { Console.WriteLine("This character " + r + " that appeared times " + arr[r] + " in a string"); } }
روش هشتم
استفاده از کلاس شمارشگر کاراکتر
class CharCount { public void CountCharacter() { int n; Console.WriteLine("enter the no. of elements: "); n = Convert.ToInt32(Console.ReadLine()); char[] chararr = new char[n]; Console.WriteLine("enter the elements in array: "); for (int i = 0; i < n; i++) { chararr[i] = Convert.ToChar(Console.ReadLine()); } Dictionary<char, int> count = chararr.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count()); foreach(KeyValuePair<char, int> key in count) { Console.WriteLine("Occurrence of {0}: {1}",key.Key,key.Value); } Console.ReadLine(); } }