我有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");
答案 0 :(得分:1)
将数组复制到列表然后应用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();
答案 1 :(得分: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()
将结果转换为数组变量。
让我知道这是否有帮助。