二维数组尺寸和遍历

时间:2018-09-23 22:51:17

标签: c# arrays

该方法试图做的是,与抽奖相比,返回每张彩票的正确选票数,彩票变量是2D数组。

 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)被确定为原因

1 个答案:

答案 0 :(得分:0)

代码有几个问题

主要是您如何获得长度。但是,您会发现使用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();

基本前提是,对于每张票证, Sum 每张票证row中的元素包含抽奖元素t

免责声明 :完全未经测试

祝你好运

其他资源

yield (C# Reference)

  

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

Enumerable.Sum Method

  

计算一系列数值的总和。

List.Contains(T) Method

  

确定元素是否在列表中。

?: Operator (C# Reference)

  

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