我有一個函式 findChar() 回圈遍歷字串以查找字串中出現的字符 Ex: "Cincinnati" (2 Cs, 2 i's, etc) 但是一旦找到另一個 'C' 或 'i' 它將回傳再次價值觀
public static int findChar(string name, char c)
{
int count = 0;
for (int i = 0; i < name.Length; i )
{
if (name[i] == c || name[i] == Char.ToUpper(c) || name[i] == Char.ToLower(c))
{
count ;
}
}
return count;
}
static void Main(string[] args)
{
string name = "Cincinnati";
char c = ' ' ;
int count = 0;
for (int i = 0; i < name.Length; i )
{
c = name[i];
count = findChar(name, c);
Console.WriteLine(count);
}
}
我的輸出如下所示: 2 3 3 2 3 3 3 1 1 3
我需要它像:2 3 3 1 1
uj5u.com熱心網友回復:
選項 1:跟蹤您已經處理過的信件,如果您已經處理過,則忽略它
選項 2:使用System.Linq'sGroupBy獲取計數
public static void Main()
{
var name = "Cincinatti";
var letters = name.ToLower().GroupBy(letter => letter);
foreach (var group in letters) {
Console.WriteLine(group.Count());
}
}
uj5u.com熱心網友回復:
有很多方法可以解決這樣的問題。首先讓我們討論一個看起來你已經遇到過的問題,大寫。相同字母的小寫和大寫版本被分類為不同的字符。解決這個問題的最簡單方法是將字串轉換為小寫或大寫,這樣每個重復的字母也可以歸類為重復字符。您可以通過使用String.ToLower()方法或String.ToUpper()方法來執行此操作,具體取決于您要使用的方法。
最接近您所擁有的解決此問題的方法是創建一個串列,在處理它們時向其中添加字母,然后使用該串列檢查您已經處理了哪些字母。它看起來像這樣:
static void Main(string[] args)
{
string name = "Cincinnati";
char c = ' ' ;
int count = 0;
var countedLetters = new List<string>();
for (int i = 0; i < name.Length; i )
{
c = name[i];
char cLower = char.ToLower(c);
if(countedLetters.Contains(cLower))
{
continue;
}
countedLetters.Add(cLower);
count = findChar(name, c);
Console.WriteLine(count);
}
}
雖然,您通常可以使用System.Linq'sEnumerabl擴展方法很容易地做這樣的事情。
與你所擁有的沒有太大的偏差,另一個使用的解決方案System.Linq是只獲取不同的字符并回圈遍歷它而不是整個字串。這樣做時,我們需要將整個字串轉換為大寫或小寫,以便 linq 回傳預期的結果。這會是這樣的:
static void Main(string[] args)
{
string name = "Cincinnati";
string nameLower = name.ToLower();
int count = 0;
foreach(char c in nameLower.Distinct())
{
count = findChar(name, c);
Console.WriteLine(count);
}
}
最后,您可以通過大量使用 linq 路線來簡化這一程序。GroupBy對此非常有用,因為它的全部目的是將重復項組合在一起。實作這一點的方法有很多,已經提供了兩種,所以我只提供第三種。
public static void Main()
{
string name = "Cincinatti";
int[] counts = name.ToLower()
.GroupBy(letter => letter)
.Select(group => group.Count())
.ToArray();
Console.WriteLine(string.Join("\n", counts));
}
uj5u.com熱心網友回復:
你可以按串列分組,排序可選(我把它注釋掉了)然后選擇計數
var word="Cincinnati";
var groups = word.ToLower().GroupBy(n => {return n;})
.Select(n => new
{
CharachterName = n.Key,
CharachterCount = n.Count()
});
// .OrderBy(n => n.CharachterName);
Console.WriteLine(JsonConvert.SerializeObject(groups.Select(i=>i.CharachterCount)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490969.html
