C#winforms - 管理两个列表中两个对象的更好方法

时间:2013-02-01 15:02:58

标签: c# list

在我的Windows窗体中,我通过业务逻辑将两个对象(order和Item)作为参数传递,我使用两个对象的不同成员变量在自定义网格中显示一行。类似于删除一行,业务逻辑传递UI,订单和项目对象,我使用这两个来定位Windows窗体中的一行并删除它们。 订单对象始终是唯一的,但是商品对象可能是也可能不是唯一的。

如果满足某些条件并且即使没有显示这些条件但是这两个对象(订单和项目)保存在列表中,那么当条件确实变为真时,线条仅显示在网格上,显示该行。一旦显示该行,如果某些条件为真,则该行再次被隐藏,但与之前一样,将存储订单和项目对象以供将来显示。

目前,我将订单对象保存在订单通用列表中,将项目对象保留在项目通用列表中。 当我必须添加或删除一行时,我在订单列表中查找订单对象,找到索引,使用相同的索引从项目列表中检索项目,并使用这两个对象显示一行。我觉得这个逻辑具有固有的风险,因为我使用一个列表中的索引来访问另一个列表中的项目,并假设两个列表大小始终相同。有没有更好的方法来实现它?

class BusinessLogic
{
    internal void UpdateUI()
    {
        OrderGrid.AddLine(order,item, bAddLine);
    }
}

public class OrderGrid : System.Windows.Forms
{
    ArrayList OrderList = new ArrayList()//This contains unique orders only
    ArrayList ItemList = new ArrayList() //This list can have duplicates

    public void DrawLine(Order order, Item item, bool bAddLine)
    {
        if(bAddLine)
        {
            if(currDisplayedLines <= MaxLinestoDisplay)
            {
                DrawLine(order,item);
            }
            else
            {
                OrderList.Add(order);
                ItemList.Add(item);
            }
        }
        else//remove line
        {
            int idx = OrderList.IndexOf(order);
            if(idx < 0)
                return;
            OrderList.RemoveAt(idx);
            ItemList.RemoveAt(idx);//not a good idea to use another list's index here)
        }
    }

    private void ClockTick()
    {
        if (currDisplayedLines < MaxLinestoDisplay)
        {
            for(int i = 0; i <OrderList.Count; i++)
            {
                while(currDisplayedLines < MaxLinestoDisplay)
                {
                    order = (Order)OrderList[i];
                    item = (Item)ItemList[i];
                    DrawLine(order,item)
                    currDisplayedLines++;
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

每当你有两个列表,其中两个列表的同一索引处的项目“属于”在一起时,您可以将其转换为具有两个属性的新类型的单个列表,一个表示每种类型类型。听起来这种转变在这里是合适的。只需创建一个具有OrderItem属性的新类型,每种类型都适当。

答案 1 :(得分:0)

为什么不创建另一个包含两个引用的类:

class ItemOrderContainer
{
    public Item Item { get; set; }
    public Order Order { get; set; }
    public bool Show { get { return /*some condition*/; }
}

也许我没有理解这个问题,但将各种事物放在一起是一种很好的做法。您仍然可以有多个ItemOrderContainer个对象引用相同的Item