【问题标题】:Remove element from list using linq [duplicate]使用linq从列表中删除元素[重复]
【发布时间】:2019-02-12 22:34:10
【问题描述】:

我有一个 ct_CompleteOrder 类型的对象,并且有以下类:

ct_CompleteOrder 类

public partial class ct_CompleteOrder {
    private ct_CompleteOrderPayments paymentsField;
}

ct_CompleteOrderPayments 类

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

ct_Payment 类

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

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

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

【问题讨论】:

  • 一个类似的SO问题在here详细讨论,这是你所追求的吗?
  • 你做错了什么假设 LINQ 是一种旨在查询和只读操作的技术,用于操作列表/写入操作的内容
  • @fujiFX 不,这是一个不同的查询。我正在寻找从数组中删除元素而不是列表
  • @HumaAli 假设查询“不同”,因为您在使用 LINQ 时使用的是数组而不是列表,这对我来说意味着您必须阅读基本的 LINQ 教程。 LINQ 不关心你的数据源是什么,这是重复的

标签: c# arrays linq removeall


【解决方案1】:

您为什么要转换为列表?我认为这是不必要的步骤。我为您创建了一个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

    }
}

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

如果这有帮助,请告诉我。

【讨论】:

    【解决方案2】:

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

    如果您想保持数组大小相同但包含空格,则应使用 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 不返回列表(它返回 void),所以你不妨颠倒你的逻辑,只使用 Where 语句

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

    【讨论】:

    • 现在我知道我错过了什么。我会接受你的第二个建议。
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 2015-01-05
    • 2012-05-09
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多