2012-12-04 28 views
1

我有一個Visual C#項目下列類:限制相結合的2名獨立的名單數量 - C#

public class Bus 
    { 
    private int BusNumber; 
    public int busNumber 
    { 
     get { return BusNumber; } 
     set { BusNumber = value; } 
    } 

    public List<CircularRoute> circularRoute = new List<CircularRoute>(); 
    public List<LongDistance> longDistance = new List<LongDistance>(); 
    } 

有什麼辦法,我可以限制這兩個列表的數量結合起來呢?我知道如果使用多態列表,我可以使用if語句輕鬆完成此操作。儘管目前這不是我的選擇。

+0

無論如何做列表加入?你是否想要允許50,50分之一的限制? – CR41G14

+0

限制計數?你是什​​麼意思?你的意思是你希望組合列表中的項目總數永遠不會超過某個閾值? – Oded

+0

是的,這就是我的意思。我可以通過使用類似於if的語句來限制一個列表的計數:'if(circularRoute.Count> = 5){MessageBox.Show(「blahblah」); }'...我想這會阻止用戶添加另一個對象到列表中。我需要此消息來顯示兩個列表的總和是否超過10. – user1769279

回答

0

自己使用列表,如果底層實現是ObservableCollection,你可能會這樣做。

另一種方法是通過輪詢來完成。但是,這並不會阻止您進入無效狀態。它只會告訴你,一旦你進入它。

自行列表將不支持所請求的功能。

2

不,你不能限制列表的長度。

什麼可以 - 使IEnumerable<T>類型的公共屬性。以及添加或刪除私人列表中的項目的方法。在這些方法上實現任何邏輯。

public class Bus 
{ 
    private int busNumber; 
    private List<CircularRoute> circularRoutes = new List<CircularRoute>(); 
    private List<LongDistance> longDistances = new List<LongDistance>(); 
    private const int MaxTotalRoutes = 10; 

    public int BusNumber 
    { 
     get { return busNumber; } 
     set { busNumber = value; } 
    } 

    public IEnumerable<CircularRoute> CircularRoutes 
    { 
     get { return circularRoutes; } 
    } 

    public IEnumerable<LongDistance> LongDistances 
    { 
     get { return longDistances; } 
    } 

    public void AddRoute(CircularRoute route) 
    { 
     if (circularRoutes.Count + longDistances.Count == MaxTotalRoutes) 
     { 
      // throw exception, do nothing, whatever 
      return; 
     } 

     circularRoutes.Add(route); 
    } 

    // add methods for adding and removing routes 
} 

BTW在C#中,我們使用PascalCase爲屬性的名稱,併爲駝峯場。

+1

使用'IEnumerable '作爲屬性的類型不能確保不能添加對象。運行時類型將決定是否可以添加項目。不是聲明的編譯時間類型 –

+0

@RuneFS是對的。在調用代碼時,我可以做'((List )aBus.CircularRoutes).Add(新的CircularRoute())'。這就是爲什麼返回列表的副本更好地保護類不變量的原因。 – Oded

+0

@在調用代碼中可以使用反射。那麼,那麼呢?我們正在討論正確使用代碼 –

2

不要將列表公開 - 將它們保持爲私有並提供添加到每個列表的方法。

在這些方法中,您可以檢查以獲得這兩個列表的計數,並且只在它們低於您的閾值時才添加。

如果你需要公開這些列表,我建議返回拷貝這些私人列表(使用拷貝構造函數),所以不會違反不變量。

private List<CircularRoute> circularRoute = new List<CircularRoute>(); 

public AddRoute(CircularRoute route) 
{ 
    if(circularRoute.Count + longDistance.Count < threshold) 
    { 
    // add logic. 
    } 
    else 
    { 
    // Perhaps throw an exception 
    } 
} 

public IEnumerable<CircularRoute> CircularRoutes 
{ 
    get { return new List<CircularRoute>(circularRoute); } 
}