Фильтр IList <T> - PullRequest
       85

Фильтр IList <T>

0 голосов
/ 11 апреля 2011
List<PaymentType> paymentOptions = _PaymentMethods;

_PaymentMethods является публичным свойством, и я хотел бы отфильтровать его копию и сохранить в переменной paymentOptions

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

Ответы [ 2 ]

3 голосов
/ 11 апреля 2011

Использовать LINQ:

List<PaymentType> paymentOptionsWithNoInvoice =  
paymentOptions.Where(a=> !noInvoice.Contains(a.Id)).ToList();
0 голосов
/ 11 апреля 2011

Вы можете использовать List<T> конструктор копирования и удалить из копии:

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