【问题标题】:Filter IList<T>过滤器 IList<T>
【发布时间】:2011-08-03 02:02:45
【问题描述】:
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;
}

【问题讨论】:

  • 您要删除所有匹配noInvoice 列表的内容,还是只删除代码中出现的第一个?
  • 你说得对,Martinho,但我知道这三个中的一个会同时出现。所以RemoveRemoveAll 都可以。但是这种方式也改变了我未过滤的_PaymentMethods

标签: asp.net c#-4.0 pass-by-reference ilist pass-by-value


【解决方案1】:

使用 LINQ:

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

【讨论】:

  • 这似乎是最好的选择。我忘记了using System.Linq,因此 paymentOptions 没有 Where 选项,因为它不是 IQueryable。您只是忘记了 !noInvoice.Contains...
【解决方案2】:

您可以使用List&lt;T&gt; copy constructor 并从副本中删除:

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

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多