c# - 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;
}
}
}
}
非常感谢!
解决方案
您可以从左到右为每个单元格分配一个数字,例如对于 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# - 如何在 C# 中格式化小数并保持以 0 结尾?
- c# - 事件处理程序是否可以测试其对象是否有资格进行垃圾回收
- c# - 如何清除xamarin中的collectionview选择
- javascript - 检查来自对象javascript的所有数据
- azure - Azure Next.js 部署。所需结构
- docker - 来自容器外部的 Docker ApacheMQ 连接
- apache-kafka - 使用 confluent-kafka-dotnet 连接到外部 Kafka 服务器失败
- c++ - 对带有库 MySQL 服务器和连接器 C++ 的 Eclipse C++ 的未定义引用
- microservices - 断路器作为独立服务
- go - 如何使用 Golang 中的反射将 time.Time 类型的字段的值设置为 time.Now()