使用 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()
将结果转换为数组变量。
如果有帮助请告诉我。
我有 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()
将结果转换为数组变量。
如果有帮助请告诉我。