
فرض کنید یکسری کاراکتر در یک رشته مثل زیر داریم :
“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();
}
}

