2 回答
TA贡献1788条经验 获得超4个赞
您的问题的原因是FindName()通过该名称查找 XAML 元素,它不会检查类成员。所以这行代码:
grid = (List<int>)this.FindName("grid" + Grid);
将永远是null,因为FindName("grid" + Grid)会返回null,那么您将其转换null为 a List<int>。所以grid将是一个null List<int>
在你的课堂上拥有所有这些列表是一个非常糟糕的设计。您可以使用字典来简化一些事情。我不完全确定我遵循你的逻辑是什么,但这是我尝试转换:
public partial class MainWindow : Window
{
public Dictionary<int, List<int>> gridDictionary = new Dictionary<int, List<int>>();
private bool numberValide(int number, int gridIndex) // Grid {1..5}
{
//Checks if dictionary has an entry at gridIndex
if(gridDictionary.ContainsKey(gridIndex))
{
if (!gridDictionary[gridIndex].Value.Contains(number))
{
//Add number to list in dictionary
gridDictionary[gridIndex].Value.Add(number);
return true;
}
else
{
return false;
}
}
else
{
//Adds a new entry to the dictionary with a list containing number
gridDictionary.Add(gridIndex, new List<int>() { number });
return true;
}
}
请记住, Dictionaries 必须具有唯一键,因此您不能这样做:
dictionary.Add(1, "one");
dictionary.Add(1, "uno");
这将引发异常,因为已存在重复键。对于您的用例,这应该没问题,因为无论如何您的所有grid变量都必须唯一命名才能编译。
TA贡献1840条经验 获得超5个赞
我怀疑这里的问题是您认为 FindName 会让您在类中找到一个字段。那不是它的作用。它在窗口中找到一个控件。grid1、grid2 等不是控件。他们是田野
如果您想查找字段,则必须使用反射……但是,更好的方法是使用一个List<List<int>>代替。
所以:
List<List<int>> grids = new List<List<int>>();
然后在某个地方(可能是构造函数)填充该列表:
for (var i=0; i < numberOfGrids; i++)
{
grids.Add(new List<int>());
}
然后当你想在你的 中检索网格时numberValide:
var grid = grids[Grid]; // where Grid is the index to your Grid -
// your variable names are confusing
但是现在,由于您最初的问题是查看您的任何整数列表中是否存在数字,您可以使用 Linq 来大大简化这一点:
var doesExist = grids.Any(g => g.Contains(number));
- 2 回答
- 0 关注
- 115 浏览
添加回答
举报