使用 linq 从列表中删除元素

Remove element from list using linq

我有 ct_CompleteOrder 类型的对象并且有以下 classes:

ct_CompleteOrder class

public partial class ct_CompleteOrder {
    private ct_CompleteOrderPayments paymentsField;
}

ct_CompleteOrder付款class

public partial class ct_CompleteOrderPayments {
    private ct_Payment[] paymentField;
    public ct_Payment[] Payment {
    get {
        return this.paymentField;
        }
    set {
        this.paymentField = value;
        }
    }
}

ct_Payment class

public partial class ct_Payment {
    public string type{get; set;}
}

我想根据类型值删除 ct_Payment 数组的元素。我尝试先将其转换为列表以应用 RemoveAll,但它不起作用。我做错了什么?

completeOrder.Payments.Payment.ToList().RemoveAll(x => x.type == "AUTO");

当您将数组复制到列表然后应用 linq 时,link 只是从列表中删除,而不是从数组中删除。

如果你想保持数组大小相同,但有空格,你应该使用 for 循环遍历数组并将任何具有 x.type == "AUTO" 的数组设置为 null .

for(int i = 0; i < completeOrder.Payments.Payment.Length; i++)
{
    if(completeOrder.Payments.Payment[i].type == "AUTO")
    {
        completeOrder.Paymets.Payment[i] == null;
    }
}

否则,如果您希望更改数组的实际大小,只需将付款设置为已更改的列表即可。 RemoveAll 不 return 列表(它 return 无效),因此您不妨颠倒逻辑并只使用 Where 语句

completeOrder.Payments.Payment = completeOrder.Payments.Payment.Where(x => x.type != "AUTO").ToArray();

您为什么要转换为列表?我认为这是一个不必要的步骤。我为您创建了一个 DotNetFiddle 来向您展示我根据对您的问题的理解所做的工作。

C#

using System;
using System.Runtime;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string[] arrayOfItems = new string[5] {"Apple", "Banana", "Orange", "Apple", "Grape"};

        var arrayWithoutApples = arrayOfItems.Where(x => x != "Apple").ToArray();

        foreach(var item in arrayWithoutApples)
        {
            Console.WriteLine(item);    
        }

        // Output:

        // Banana
        // Orange
        // Grape

    }
}

我敢肯定我的例子没有你的代码那么复杂,但是如果你有一个值数组,并且你想 'slim' 通过根据特定条件删除元素来 'slim' 该数组,那么你应该' 必须事先转换为列表。使用 Where 检索您想要或不想要的项目,然后使用 ToArray() 将结果转换为数组变量。

如果有帮助请告诉我。