因此,在这个数组中,每个数字都是一个结果,该结果的索引是分配给给出结果的人的数字。我需要找出哪个得分手在阵列中的所有行中都给出了最高的结果。那么,假设结果[0-3,3]是所有行的得分手3,我该如何找出哪个得分手在所有行的总成绩最高?输出的一个例子是
所以输出的例子是"评分者4给出了最高的平均分9"
int[,] results ={//Each number is a scorer's score
{ 4, 7, 9, 3, 8, 6},//competitor 1
{ 4, 8, 6, 4, 8, 5},//competitor 2
{ 2, 1, 10, 10, 10, 10}
};
从你的问题中听起来,你想知道哪个列(得分者)的平均得分最高,而不是哪个行。
我会这样做:
var bestScorer =
results
.OfType<int>()
.Select((x, n) => new { x, n })
.GroupBy(xn => xn.n % results.GetLength(1))
.Select(gxns => new
{
average = gxns.Average(xn => xn.x),
scorer = gxns.Key + 1,
})
.OrderByDescending(x => x.average)
.Select(x =>
String.Format(
"Scorer {0} gave the highest average score of {1}",
x.scorer,
x.average))
.First();
这给出了以下结果:
得分者5的平均得分最高,为8.66666666667
如果将字符串格式更改为"Scorer {0} gave the highest average score of {1:0}"
,则会得到:
得分者5的平均得分最高,为9分
如果您确实想要行/竞争对手,那么将%
更改为/
,这将仍然有效。
用一个循环做这件事看起来像这样:
var best = new { scorer = -1, average = double.MinValue };
for (var j = 0; j < results.GetLength(1); j++)
{
var total = 0;
for (var i = 0; i < results.GetLength(0); i++)
{
total += results[i, j];
}
var current = new { scorer = j + 1, average = (double)total / results.GetLength(0) };
if (current.average > best.average)
{
best = current;
}
};
var output =
String.Format(
"Scorer {0} gave the highest average score of {1}",
best.scorer,
best.average);
我得到了与上面相同的输出。
使用列表<>带linq
static void Main(string[] args)
{
List<List<int>> results = new List<List<int>>() {//Each number is a scorer's score
new List<int>(){ 4, 7, 9, 3, 8, 6},//competitor 1
new List<int>(){ 4, 8, 6, 4, 8, 5},//competitor 2
new List<int>(){ 2, 1, 10, 10, 10, 10}
};
var max = results.Select((x, i) => new
{
total = x.Sum(),
index = i
}).OrderByDescending(x => x.total).Take(1);
}
我想有些竞争对手可能会得到相同的分数。bestScorersIds
是具有最大总分的竞争对手的索引列表。
int[,] results ={//Each number is a scorer's score
{ 4, 7, 9, 3, 8, 6},//competitor 1
{ 4, 8, 6, 4, 8, 5},//competitor 2
{ 2, 1, 10, 10, 10, 10}
};
var max = Enumerable.Range(0, results.GetLength(0))
.Max(i => Enumerable.Range(0, results.GetLength(1)).Sum(j => results[i,j]));
var bestScorersIds = Enumerable.Range(0, results.GetLength(0))
.Where(i => Enumerable.Range(0, results.GetLength(1)).Sum(j => results[i, j]) == max)
.ToList();
演示
带环路的替代解决方案:
int[,] results ={//Each number is a scorer's score
{ 4, 7, 9, 3, 8, 6},//competitor 1
{ 4, 8, 6, 4, 8, 5},//competitor 2
{ 2, 1, 10, 10, 10, 10}
};
List<int> bestScorersIds = new List<int>();
int bestScore = 0;
for (int i = 0; i < results.GetLength(0); i++)
{
int tempScore = 0;
for (int j = 0; j < results.GetLength(1); j++)
tempScore += results[i, j];
if (tempScore < bestScore) continue;
if(tempScore > bestScore) bestScorersIds.Clear();
bestScorersIds.Add(i);
}