首页 > 解决方案 > 二维数组尺寸和遍历

问题描述

该方法试图做的是,与平局相比,返回每张票的正确选择数,票变量是一个二维数组。

 private int[] lottoMatches(int[] draw, int[][] ticket)
    {
        // TODO
        List<int> finalresult = new List<int>();
        for(int r = 0; r < ticket.GetLength(0); r++)
        {
            int drw = 0, tck = 0;
            List<int> result = new List<int>();
            while (drw < draw.Length && tck < ticket.GetLength(1))
            {
                if (ticket[r][tck] == draw[drw])
                {
                    result.Add(ticket[r][tck]);
                }
                else
                {
                    drw++;
                }
                if (drw == draw.Length && tck < ticket.Length)
                {
                    tck++;
                    drw = 0;
                }
            }
            finalresult.Add(result.Count);
        }
        return finalresult.ToArray();
    }

指数数组的边界之外。' 运行时返回错误,ticket.GetLength(1) 被识别为原因

标签: c#arrays

解决方案


代码有几个问题

主要是你如何获得长度。但是,您会发现使用yieldIEnumerable.SumList<T>.Contains和条件操作符的更优雅的解决方案

private static IEnumerable<int> lottoMatches(int[] draw, int[][] ticket)
{
   for (var row = 0; row < ticket.GetLength(0); row++)
      yield return draw.Sum(t => (ticket[row].Contains(t) ? 1 : 0));
}

用法

foreach(var result = lottoMatches(draw,tickets))
{
    Console.WeiteLine(Result);
}

或者

var results = lottoMatches(draw,tickets).ToArray();

基本前提,是对每张票,对每张票中包含抽奖元素的元素求和rowt

免责声明:完全未经测试

祝你好运

其他资源

产量(C# 参考)

在语句中使用 yield 关键字时,表明它出现的方法、运算符或 get 访问器是迭代器。当您为自定义集合类型实现 IEnumerable 和 IEnumerator 模式时,使用 yield 定义迭代器无需显式的额外类(保存枚举状态的类,请参见 IEnumerator 示例)。

Enumerable.Sum 方法

计算一系列数值的总和。

List.Contains(T) 方法

确定元素是否在列表中。

?: 运算符(C# 参考)

条件运算符 (?:),通常称为三元条件运算符,根据布尔表达式的值返回两个值之一。以下是条件运算符的语法。


推荐阅读