检查2d数组是否包含第二点的值

时间:2017-05-06 10:35:22

标签: c# arrays visual-studio

我正在创建一个用于抽奖的2D数组。基本上它是一组2个整数:  int[,] coupon = new int[rowAmount, numAmount]; 其中rowAmount是行数,numAmount是该行中的数字量。

现在我需要为每一行选择数字,但是在特定行中可能没有重复数字。

        for (int r = 0; r < rowAmount; ++r)
    {
        for (int n = 0; n < numAmount; ++n)
        {
            userNum = lotRng.Next(1, numAmount * rngMult);
            while (COUPON CONTAINS DUPLICATE NUMBER ON SECOND SPOT )
            {
                userNum = lotRng.Next(1, numAmount * rngMult);
            }
            coupon[r, n] = userNum;
        }                    
    }

我的问题是while部分,我无法弄清楚如何在第二个插槽(numAmount插槽)上检查coupon是否包含userNum。对于我过去只做list.Contains()的列表和内容,但这似乎并没有在这里工作。

3 个答案:

答案 0 :(得分:0)

根据阵列的大小,优化性能是有意义的。

取决于一种可能性是对数组进行排序并使用Array.BinarySearch。

你必须为此排序数组。

https://msdn.microsoft.com/en-us/library/2cy9f6wb(v=vs.110).aspx

因此,您可以通过多种方式优化数据结构。

答案 1 :(得分:0)

包含一系列列表的解决方案是我最喜欢的解决方案之一。它与我的另一个非常类似于锯齿状阵列但更快 - 因为列表搜索效率最高而Linq搜索不是。

const int rowAmount = 1000;
const int numAmount=1000;
const int rngMult = 10;
Random lotRng = new Random();
var coupon = new List<int>[rowAmount];
int userNum;

for (int r = 0; r < rowAmount; r++)
{
    coupon[r]= new List<int>();
    for (int n = 0; n < numAmount; ++n)
    {
        do userNum = lotRng.Next(1, numAmount * rngMult);
        while (coupon[r].Contains(userNum));
        coupon[r].Add(userNum);
    }
}

当然,如有必要,也可以使用列表列表(某种2D列表)。

var couponLoL = new List<List<int>>();

以下快速和脏的方式显示了将2D数组复制到列表的可能方法,但由于多种原因(环路,值为拳击类型)不推荐这里:

var coupon= new int[rowAmount,numAmount];

[..]

        do userNum = lotRng.Next(1, numAmount * rngMult);
        while (coupon.Cast<int>().ToList().Contains(userNum));

在这种特殊情况下,它更没意义,因为这将在整个2D数组中查找double值。但是值得知道如何从2D转换为1D数组(然后在列表中)。

答案 2 :(得分:-1)

正如您在评论中所说,您需要检查所有n个字段与新的userNum。您可以使用以下代码解决此问题:

<?php
 function aduna($a,$b){    
$d=$a+$b;}
 $d=aduna(2,3);
var_dump($d);
?>

我希望这对你有所帮助。