首页 > 解决方案 > C#/我通过随机选择下一个单元格从字符串数组中填充 DataGridView,并且不想再次选择使用过的单元格

问题描述

我有一个字符串数组,必须通过随机选择下一个单元格来填充 DataGridView。我想使用数组的所有项目,但避免选择我已经填满的单元格。如果有空单元格很好,但我必须使用所有项目。

我尝试了什么:

foreach (var item in myarray)
        {
            y = random.Next(0, 5);
            x = random.Next(0, t.Rows.Count);
            t.CurrentCell = t[y, x];

            for (int j = 0; j < t.Columns.Count; j++)
            {
                
                for (int k = 0; k < t.Rows.Count; k++)
                {
                   
                    if (t.Rows[k].Cells[j].Value == null)
                    {
                        t.CurrentCell.Value = item;
                    }
                }
            }
        }

                    

非常感谢!

标签: c#arraysrandomdatagridview

解决方案


您可以从左到右为每个单元格分配一个数字,例如对于 4x4 矩阵,每个单元格将从 0 到 15 编号。之后,您可以打乱0...15整数数组并通过将字符串分配给您对应的单元格来迭代该数组可以通过将数组 (cellNumber) 中的数字转换回坐标,如下所示 (cellNumber / rowsCount, cellNumber % columnsCount)

考虑以下源代码:

private static Random rng = new Random();  

public static void Shuffle<T>(this IList<T> list)  
{  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

public static (int x, int y) GetCoordinates(int cellNumber, int rowsCount, int columnsCount) {
    return (cellNumber / rowsCount, cellNumber % columnsCount);
}

public static void Main()
{
    var rowsCount = 4;
    var columnsCount = 4;
    var cellNumbers = Enumerable.Range(0,rowsCount*columnsCount - 1).ToList();
    cellNumbers.Shuffle();
    foreach (var cellCoordinates in cellNumbers.Select(x => GetCoordinates(x, rowsCount, columnsCount))) {
        Console.WriteLine($"{cellCoordinates.x},{cellCoordinates.y}");
    }
}

推荐阅读