如何顯示常用號碼?但如果其他數字同樣常見,我希望能夠顯示多個。
所以我有一個最大長度為 24 的陣列,我可以生成 1-100 之間的亂數并對它們進行排序。
看起來像這樣.. 2 8 9 10 13 19 20 38 43 47 51 55 55 59 66 67 73 84 87 87 93 95 98 100
所以最常見的數字是 55 和 87,因為 55 和 87 出現了兩次。
這是我的代碼..
private void buttonMode_Click(object sender, EventArgs e)
{
int mode = 0;
int max = 0;
var counts = new Dictionary<int, int>();
foreach (int value in dataArray)
{
if (counts.ContainsKey(value))
{
counts[value] ;
}
else
{
counts.Add(value, 1);
}
}
foreach(KeyValuePair<int,int> count in counts)
{
if (count.Value > max)
{
mode = count.Key;
max = count.Value;
}
}
textBoxOut1.Text = $"Mode is: {mode}";
}
這僅顯示最低的公共值,使用上面的示例將僅為 55。我已經搜索過并通過使用 .Max 可以做到這一點,但是怎么做呢?
uj5u.com熱心網友回復:
您可以使用GroupBy,一個用于int-value,另一個用于組大小:
List<List<int>> maxGroups = dataArray
.GroupBy(i => i) // group by int-value
.GroupBy(g => g.Count(), g => g.ToList()) // group groups by size
.OrderByDescending(g => g.Key) // get biggest group
.First()
.ToList();
這為您提供了一個包含兩個子串列的串列,每個子串列包含 2 個整數,一個 55,另一個 87。
如果你想使用你的計數字典,你可以使用這個:
int maxCount = counts.Values.Max();
List<(int value, int count)> maxValueCounts = counts
.Where(kv => kv.Value == maxCount)
.Select(kv => (kv.Key, kv.Value))
.ToList();
在這里,您將獲得一個串列,其中包含命名元組中的最大計數值。
uj5u.com熱心網友回復:
您可以在第二個 foreach 中使用 'textBoxOut1.Text = mode ", "'。
提示:為了使代碼更易于除錯和閱讀,將其分成多個函式:“List CountOccurences(List list)”和“List FindTopMostCommon(List list)”(或者您喜歡的命名方式)。
或者按照 Time 的建議將其全部歸結為 Linq
uj5u.com熱心網友回復:
您還可以用以下代碼替換字典上的foreach:counts
var modes = counts.Where(count => count.Value == counts.Values.Max());
var output = string.Join(", ", modes.Select(c => c.Key.ToString()));
textBoxOut1.Text = $"Mode is: {output}";
uj5u.com熱心網友回復:
在我的解決方案中,您不需要撰寫任何回圈。
var dict = dataArray.GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());
var max = dict.Values.Max();
var modes = dict.Where(x => x.Value == max)
.Select(x => x.Key);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533970.html
標籤:C#窗体
