C#/我通过随机选择下一个单元格来填充字符串数组中的 DataGridView,并且不想再次选择使用过的单元格

Posted

技术标签:

【中文标题】C#/我通过随机选择下一个单元格来填充字符串数组中的 DataGridView,并且不想再次选择使用过的单元格【英文标题】:C# / I fill up a DataGridView from a string array by picking the next cell randomly and do not want to pick used cell again 【发布时间】:2021-10-12 10:50:21 【问题描述】:

我有一个字符串数组,必须通过随机选择下一个单元格来填充 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;
                    
                
            
        

                    

非常感谢!

【问题讨论】:

这个问题几乎肯定会被锁定,但这是答案——构造一个包含所有可能单元格位置的列表,然后遍历字符串数组一次,从位置列表中随机选择目标单元格,然后删除它。例如,位置列表可以是 (x,y) 元组的列表。 【参考方案1】:

您可以从左到右为每个单元格分配一个数字,例如对于 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");
    

【讨论】:

以上是关于C#/我通过随机选择下一个单元格来填充字符串数组中的 DataGridView,并且不想再次选择使用过的单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何通过仅选择表正下方行中的任何单元格来触发宏(ListObject)

使用 NSMutableDictionary 和数组填充单元格的 TableView

UITableView 单元格未填充 CloudKit 数据

如果 UICollectionView 没有足够的单元格来填充一行,则使第一行不完整而不是最后一行

我想通过单击解析 Json 的集合视图单元格来获取特定数据

使用字母A到(用户选择的值)填充数组