c#数组线性搜索



因此,在这个数组中,每个数字都是一个结果,该结果的索引是分配给给出结果的人的数字。我需要找出哪个得分手在阵列中的所有行中都给出了最高的结果。那么,假设结果[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);
}

最新更新