How to improve compare of item in sorted List<MyItem> with item before and after current item?

Posted by Oliver on Stack Overflow See other posts from Stack Overflow or by Oliver
Published on 2010-04-30T14:31:00Z Indexed on 2010/05/03 11:18 UTC
Read the original article Hit count: 535

Filed under:
|

Does anyone know about a good way to accomplish this task?

Currently i'm doing it more ore less this way, but i'm feeling someway unhappy with this code, unable to say what i could immediately improve.

So if anyone has a smarter way of doing this job i would be happy to know.

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

Update

After reading the answer from Aaronaught and a little weekend to refill full mind power i came up with the following solution, that looks far better now (and nearly the same i got from 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;
}

© Stack Overflow or respective owner

Related posts about c#3.0

Related posts about .net-3.5