2011-04-11 5 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'리스트와 일치하는 것들을 모두 제거하기를 원한다. 코드 에서처럼? –

+0

당신은 맞습니다 Martinho,하지만 나는 한 번에 세 가지 중 하나가 발생합니다 알아요. 그래서'Remove' 또는'RemoveAll'은 모두 괜찮습니다. 하지만이 방법은 필터링되지 않은'_PaymentMethods'도 변경합니다. –

답변

3

사용 LINQ :

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

이것은 최선의 선택입니다. 'using System.Linq'을 잊었고 paymentOptions에는 IQueryable이 아니기 때문에 Where 옵션이 없습니다. 너는 단지! noInvoice.Contains을 잊었다. –

0

당신은 List<T>copy constructor를 사용하고 복사본에서 제거 할 수 있습니다

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