2011-04-11 68 views
0
List<PaymentType> paymentOptions = _PaymentMethods; 

_PaymentMethods是公共財產,我想過濾它的副本,並將其存儲在變量paymentOptions過濾器的IList <T>

List<Int32> noInvoice = new List<Int32>(){ 16, 4 , 6 }; 
foreach (PaymentType pt in paymentOptions) 
{ 
    if(noInvoice.Contains(pt.Id)) 
    { 
     paymentOptions.Remove(pt); 
     break; 
    } 
} 

但是,如果你運行這個第二次,變量_PaymentMethods不再包含已移除的項目。

它似乎是通過引用而不是按值... 我不喜歡將列表複製到一個數組 我應該使用Linq還是有其他方法?

編輯:我現在有這樣的:

List<PaymentType> paymentOptions = ShopController.CurrentShop.PaymentMethods; 
List<PaymentType> paymentOptionsFiltered = new List<PaymentType>();  

if (haveToFilter) 
{ 
    List<Int32> noInvoice = new List<Int32>() { 16, 4, 6 }; 

    foreach (PaymentType pt in paymentOptions) 
    { 
     if (!noInvoice.Contains(pt.Id)) 
     { 
      paymentOptionsFiltered.Add(pt); 
     } 
    } 
    repeaterPaymentOptions.DataSource = paymentOptionsFiltered; 
} 
else 
{ 
    repeaterPaymentOptions.DataSource = paymentOptions; 
} 
+0

你想要刪除所有匹配'noInvoice'列表或第一個列表的列表在你的代碼中發生? – 2011-04-11 13:42:01

+0

你說得對,馬蒂奧,但我知道三人中只有一人會發生在同一時間。所以'Remove'或'RemoveAll'都很好。但這種方式改變了我未經過濾的_PaymentMethods也 – 2011-04-11 13:47:01

回答

3

使用LINQ:

List<PaymentType> paymentOptionsWithNoInvoice = 
paymentOptions.Where(a=> !noInvoice.Contains(a.Id)).ToList(); 
+0

這似乎是最好的選擇。我忘記了'使用System.Linq',因此paymentOptions沒有Where選項,因爲它不是IQueryable。您只會忘記!noInvoice.Contains ... – 2011-04-11 14:15:47

0

您可以使用List<T>copy constructor,並從副本中刪除:

var paymentOptionsWithNoInvoice = new List<PaymentType>(_PaymentMethods); 
paymentOptionsWithNoInvoice.RemoveAll(pt => noInvoice.Contains(pt.Id));