如何改进排序List <myitem>中的项目与当前项目之前和之后的项目的比较?</myitem>

时间:2010-04-30 14:31:00

标签: c# .net

有没有人知道完成这项任务的好方法?

目前我正以这种方式做得更少,但我对这段代码感到不满意,无法说出我能立刻改进的地方。

因此,如果有人有更聪明的方式完成这项工作,我很乐意知道。

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;
}

1 个答案:

答案 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;
}

假设CheckCollisionWithPreviousCheckCollisionWithFollowing执行基本相同的比较,那么这将使用更少的代码执行相同的功能。

我还将list作为参数添加到第二个函数中;将它作为第一个函数中的参数,然后引用它调用的函数中的硬编码成员是没有意义的。如果您要获取参数,则将该参数传递给链。

就性能而言,每次发生这种情况时,您都会对列表进行重新排序;如果它经常发生,你可能最好先使用排序集合。

编辑:只是为了更好的衡量,如果此代码的整点 只是来检查某种重复密钥,那么您将方式最好使用首先阻止这种情况的数据结构,例如Dictionary<TKey, TValue>