众所周知,通过==比较浮点数通常是一个错误.在我写的3D矢量类(具有浮点分量X,Y,Z)中,如果它们的距离被认为是零,则认为两个矢量相等.
public override bool Equals(object obj)
{
if (obj == null) {
return false;
}
if (GetType () != obj.GetType ()) {
return false;
}
float d = DistSq ((Vec) obj);
return IsConsideredZero (d);
}
public float DistSq(Vec p)
{
Vec d = this - p;
return d.LengthSq ();
}
public float LengthSq()
{
return X * X + Y * Y + Z * Z;
}
private const float VEC_COMPARE_EPSILON_ABS = 1E-05f;
public static bool IsConsideredZero(float f)
{
return …Run Code Online (Sandbox Code Playgroud) 我有一个特定类的元素列表.该类包含一个字段.
class Foo {public int i;}
List<Foo> list;
Run Code Online (Sandbox Code Playgroud)
我想将列表中所有项目的字段提取到一个新列表中.
List<int> result = list.ExtractField (e => e.i); // imaginary
Run Code Online (Sandbox Code Playgroud)
肯定有多种方法可以做到这一点,但我还没有找到一个漂亮的解决方案.我认为linq可能有所帮助,但我不确定究竟是怎么回事.
我想将ListView绑定到List<string>.我正在使用此代码:
somelistview.DataBindings.Add ("Items", someclass, "SomeList");
Run Code Online (Sandbox Code Playgroud)
我收到此异常:无法绑定到属性'Items',因为它是只读的.
如果Items属性是只读的,我不知道如何绑定?
在表格中,比较
BeginInvoke (new Action (() => {
MessageBox.Show ());
}));
Run Code Online (Sandbox Code Playgroud)
同
Invoke (new Action (() => {
MessageBox.Show ());
}));
Run Code Online (Sandbox Code Playgroud)
有什么区别,什么时候应该使用一个而不是另一个?如何通过MessageBox的消息泵来影响行为?
我做了一些测试,发现两种方法都阻止了UI.
唯一的区别是Invoke实际上是立即调用的,而BeginInvoke需要(非常短的)时间直到代码运行.这是可以预料的.
这实际上是一个基于麻将的问题,但基于Romme甚至基于扑克的背景也很容易理解.
在Mahjong中,14个瓷砖(瓷砖就像扑克中的卡片)被安排成4套和一对.街道("123")总是使用3个瓷砖,而不是更多而不是更少.一组相同类型("111")也包含3个瓷砖.这导致3*4 + 2 = 14个瓦片的总和.
有一些例外,如Kan或十三个孤儿,这里没有相关性.颜色和值范围(1-9)对于算法也不重要.
我正在尝试确定手是否可以按上述方式排列.出于某些原因,它不仅应该能够处理14个而且可以处理任意数量的瓷砖.(下一步是找到需要交换多少个牌才能完成一手牌.)
例子:
11122233344455 - 足够容易,4套和一对.
12345555678999- 123,456,789,555,99
11223378888999- 123,123,789,888,99
11223344556789- 不是有效的手
我目前尚未实现的想法是这样的:对于每个瓷砖,尝试制作a)街道b)一组c)一对.如果没有工作(或者将有> 1对),请返回上一次迭代并尝试下一个选项,或者,如果这是最高级别,则失败.否则,从剩余的切片列表中删除使用过的切片,然后继续下一次迭代.
我相信这种方法有效并且速度也相当快(性能是一个"不错的奖励"),但我对你的看法很感兴趣.你能想到其他解决方案吗?这个或类似的东西是否已存在?
(不是作业,我正在学习麻将.)
我想将一个大致矩形的区域复制到一个矩形区域.例:

两个区域都由角点定义.总体方向保持不变(没有翻转等).
简单地旋转源图像不起作用,因为相对的侧面可能具有不同的长度.
到目前为止,我发现在纯C#中没有办法做到这一点(手动像素复制除外),所以我想我必须求助于Windows API或某些第三方库?
如果将无效值传递给属性setter并且ArgumentException抛出(或者从它派生的类的可能性),那么应该为paramName参数分配什么值?
value,因为它似乎是实际的论点?
传递财产的名称不是更清楚吗?
我理解最好在Pen和Brush实例上调用Dispose(),除非它们已经设置为系统预定义值(例如System.Drawing.Brushes, System.Drawing.Pens或System.Drawing). SystemBrushes)
尝试处置系统定义的资源会导致抛出异常.
除了在try/catch中包装Dispose()调用之外,这些资源中的一个是否引用了系统定义的值或用户定义的值,这似乎并不明显.
如http://docs.oracle.com/javase/tutorial/java/IandI/override.html所示,Java确实允许
我的问题是为什么Java不允许通过实例方法隐藏静态超类方法.这可以这样做:
class Base {
static void foo () {}
}
class Derived extends Base {
void foo () {}
void access () {
foo ();
Base.foo ();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到上述方法有任何特殊问题 - 它只是像"允许的"隐藏静态的"混乱/复杂".
c# ×6
winforms ×3
.net ×2
algorithm ×1
data-binding ×1
exception ×1
gdi+ ×1
hashcode ×1
idisposable ×1
inheritance ×1
java ×1
linq ×1
mahjong ×1
messagebox ×1
poker ×1
recycle-bin ×1