有没有人知道完成这项任务的好方法?
目前我正以这种方式做得更少,但我对这段代码感到不满意,无法说出我能立刻改进的地方。
因此,如果有人有更聪明的方式完成这项工作,我很乐意知道。
private bool Check(List<MyItem> list)
{
bool result = true;
//MyItem implements IComparable<MyItem>
list.Sort();
for (int pos = 0; pos < list.Count - 1; pos++)
{
bool previousCheckOk = true;
if (pos != 0)
{
if (!CheckCollisionWithPrevious(pos))
{
MarkAsFailed(pos);
result = false;
previousCheckOk = false;
}
else
{
MarkAsGood(pos);
}
}
if (previousCheckOk && pos != list.Count - 1)
{
if (!CheckCollisionWithFollowing(pos))
{
MarkAsFailed(pos);
result = false;
}
else
{
MarkAsGood(pos);
}
}
}
return result;
}
private bool CheckCollisionWithPrevious(int pos)
{
bool checkOk = false;
var previousItem = _Item[pos - 1];
// Doing some checks ...
return checkOk;
}
private bool CheckCollisionWithFollowing(int pos)
{
bool checkOk = false;
var followingItem = _Item[pos + 1];
// Doing some checks ...
return checkOk;
}
在阅读了Aaronaught的答案和一个小周末以重新充满思想能力后,我提出了以下解决方案,现在看起来好多了(和Aaronaught几乎一样):
public bool Check(DataGridView dataGridView)
{
bool result = true;
_Items.Sort();
for (int pos = 1; pos < _Items.Count; pos++)
{
var previousItem = _Items[pos - 1];
var currentItem = _Items[pos];
if (previousItem.CollidesWith(currentItem))
{
dataGridView.Rows[pos].ErrorText = "Offset collides with item named " + previousItem.Label;
result = false;
sb.AppendLine("Line " + pos);
}
}
dataGridView.Refresh();
return result;
}
答案 0 :(得分:1)
当然可以减少重复:
private bool Check(List<MyItem> list)
{
list.Sort();
for (int pos = 1; pos < list.Count; pos++)
{
if (!CheckCollisionWithPrevious(list, pos))
{
MarkAsFailed();
return false;
}
MarkAsGood();
}
return true;
}
private bool CheckCollisionWithPrevious(List<MyItem> list, int pos)
{
bool checkOk = false;
var previousItem = list[pos - 1];
// Doing some checks ...
return checkOk;
}
假设CheckCollisionWithPrevious
和CheckCollisionWithFollowing
执行基本相同的比较,那么这将使用更少的代码执行相同的功能。
我还将list
作为参数添加到第二个函数中;将它作为第一个函数中的参数,然后引用它调用的函数中的硬编码成员是没有意义的。如果您要获取参数,则将该参数传递给链。
就性能而言,每次发生这种情况时,您都会对列表进行重新排序;如果它经常发生,你可能最好先使用排序集合。
编辑:只是为了更好的衡量,如果此代码的整点 只是来检查某种重复密钥,那么您将方式最好使用首先阻止这种情况的数据结构,例如Dictionary<TKey, TValue>
。