我实例化一个这样的数组:
int array[] = new int[4];
Run Code Online (Sandbox Code Playgroud)
这四个成员的默认值是什么?它是null,0还是不存在?
有没有最佳实践方法来验证用户输入?
实际问题:
用户在窗口中给出某些输入.当他完成这些输入后,他可以点击"创建".现在,应显示一条弹出消息,其中包含所有无效输入.如果没有无效输入,那么继续.
我可以在Form类中轻松完成此操作.但我记得在设置属性中验证输入的一些最佳实践方法.问题是我已经创建了该类的实例(否则,无法设置属性;))如果我以这种方式验证.这不应该发生,除非输入有效,否则不会创建类的实例.
我打算创建一个ErrorMessages类,其中包含一个列表,我可以将所有errorMessages放入其中.每次给出无效输入时,都会向errorMessages列表添加一条新消息.因此,如果用户单击"创建"按钮,则会显示列表中的所有消息.这是处理事情的好方法吗?
那么有最好的练习方式吗?任何提供此类解决方案的设计模式?
编辑:这是一项学校任务.因此有不合逻辑的要求.单击"创建"时,我必须显示所有无效输入.我想从Form类中做到这一点.(因此即使没有GUI,验证也能正常工作,此时我甚至还没有创建GUI).首先确保我的功能正常工作;).我想保持我的代码干净,抽象和OOP.那么我应该如何显示我的错误消息?
使用C# Windows Forms;
我有DataGridView一些细胞.我想在单元格中显示数字(从1-9开始).数字应以3x3格式放在彼此之下.
我环顾四周,结果只是一个相当复杂的richtextbox单元格自定义实现.
有没有办法我可以绘制一个custom rectangle然后实现这个backgroundimage单元格的东西?细胞需要重新绘制几次.所以我不能只调用这个paint事件.
注意:用户不得编辑单元格.
我知道你可以使用Enumerable.SequenceEqual来检查相等性.但是多维数组没有这种方法.关于如何比较二维数组的任何建议?
实际问题:
public class SudokuGrid
{
public Field[,] Grid
{
get { return grid; }
private set { grid = value; }
}
}
public class Field
{
private byte digit;
private bool isReadOnly;
private Coordinate coordinate;
private Field previousField;
private Field nextField;
}
Run Code Online (Sandbox Code Playgroud)
所有这些属性都在SudokuGrid构造函数中设置.因此,所有这些属性都有私人制定者.我想保持这种方式.
现在,我正在使用C#单元测试进行一些测试.我想比较Grids他们的价值2 ,而不是他们的参考.
因为我通过构造函数使用私有setter设置所有内容.类中的Equal覆盖SudokuGrid是正确的,但不是我需要的:
public bool Equals(SudokuGrid other)
{
if ((object)other == null) return false;
bool isEqual = true;
for (byte x = 0; x …Run Code Online (Sandbox Code Playgroud) 关注此网站:http://www.csharp411.com/c-object-clone-wars/
我决定手动创建我的课程的深层副本(在网站1.手动克隆之后).我实现了克隆接口和任何必要的属性.我执行了我的程序并检查了我的克隆是否确实与原始实例相同.这是对的.
但是,我的新实例仍然引用了原始实例.因此,我的副本中的任何更改都会反映到原始实例中.
因此,如果这不会创建一个深层副本,那么呢?什么可能出错?
(我想手动进行深度复制以提高我的性能,因此我不想使用ObjectCopier类.(即使它工作得很好,也需要90%的代码运行时间).
代码片段:
类实现:
public class SudokuAlgorithmNorvig: ICloneable
{
Run Code Online (Sandbox Code Playgroud)
克隆方法:
public object Clone()
{
SudokuAlgorithmNorvig sudokuClone = new SudokuAlgorithmNorvig(this.BlockRows, this.BlockColumns);
sudokuClone.IsSucces = this.IsSucces;
if (this.Grid != null) sudokuClone.Grid = (Field[,])this.Grid;
if (this.Peers != null) sudokuClone.Peers = (Hashtable)this.Peers;
if (this.Units != null) sudokuClone.Units = (Hashtable)this.Units;
return sudokuClone;
}
Run Code Online (Sandbox Code Playgroud)
克隆方法调用:
SudokuAlgorithmNorvig sudokuCopy = (SudokuAlgorithmNorvig)sudoku.Clone()
Run Code Online (Sandbox Code Playgroud)
我在所有其他类中都做了同样的事情(实现和设置克隆方法).(Field+ Coordinate)
我正在使用此YouTube视频中描述的回溯算法.
现在,我应该能够获得所有可能的解决方案.我能用回溯算法做到这一点吗?如果不可能,我应该使用哪种(简单)算法?
我知道您可以给列表对象作为列表构造函数的参数,以将 1个列表复制到另一个列表。
这样,如果使用的类型是一次简单的内置操作(正是?),则可以创建一个深层副本。例如字符串类型:
List<string> testList = new List<string>();
List<string> testListCopy = new List<string>(testList );
Run Code Online (Sandbox Code Playgroud)
如果使用嵌套列表,是否可以创建深层副本?:
List<List<string>> testList = new List<List<string>>();
List<List<string>> testListCopy = new List<List<string>>(testList );
Run Code Online (Sandbox Code Playgroud) 我对此有疑问BackgroundWorker.我可以在ProgressChanged没有启动线程的情况下调用该事件RunWorkerAsync.
我不明白为什么会这样.如果新线程还没有启动,它如何通知原始线程?
这似乎无论如何都有效,因为它更新GUI没有问题,在我实现之前不是这样的BackgroundWorker.
如果我得到这个代码示例:
for s,d in grid_values(grid).items():
if d in digits and not assign(values, s, d):
return False ## (Fail if we can't assign d to square s.)
return values
Run Code Online (Sandbox Code Playgroud)
我怎么知道结束的地方?因为据我所知,你可以把这一切写成一行.
根据这个答案,我成功复制了我的对象.
但是,性能是我当前项目中的最高优先级.所以我做了一些单元测试并检查了执行所需的时间.结果是平均2秒,而我期待最大200毫秒!我发现90%的时间花在了Object复印机上.
有没有办法提高这种表现?还有其他任何复制对象的方法吗?有谁知道复制数组或列表有多快?我会考虑使用这样的.
使用C#.
我有一个MainFoo类:
class MainFoo
{
private Foo foo;
public MainFoo()
{
this.foo = new Foo();
}
public CreateNewFoo()
{
this.foo = new Foo();
}
public DoCurrentFoo()
{
this.foo.Do();
}
}
Run Code Online (Sandbox Code Playgroud)
一个Foo类:
class Foo
{
~Foo()
{
this.DoEnd();
}
public void Do() {}
private void DoEnd() {}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够DoEnd() 在每次private Foo;重新初始化时调用Foo类中的方法.这个方法DoEnd()是私有的,我想保持这种方式(因此无法访问MainFoo).
由于同样的Foo get再次初始化,我虽然实例会松开它的引用,所以它会调用析构函数.但只有在MainFoo实例丢失引用时才会调用此方法.
问题:丢失引用时如何处置对象实例?
我想用c#做一个数独.我应该使用锯齿状或多维数组.为什么?
我知道,对于简单的数组逻辑,例如数独,锯齿状数组更快更有效.但也许还有其他争论?
提前致谢.
编辑:我需要在数独上执行一些解决方法.像回溯算法一样.我发现多维数组有更好的语法.
我想我的问题是:哪个最简单易用,实现和修改?
如何byte[] digits;用n个字节创建?
我知道我可以做Enumerable.Range(1, n).ToArray();但这会创建一个int [].有没有办法创建一个byte []?
我的首要任务是快速表现.记住这一点,是否有更快的方法(代码稍多)可以创建这个?
c# ×12
winforms ×3
arrays ×2
deep-copy ×2
object ×2
reference ×2
backtracking ×1
byte ×1
clone ×1
compare ×1
copy ×1
datagridview ×1
destructor ×1
enumerable ×1
equals ×1
for-loop ×1
if-statement ×1
input ×1
list ×1
member ×1
python ×1
solution ×1
sudoku ×1