如何在C#中从列表中删除项目?

15 浏览
0 Comments

如何在C#中从列表中删除项目?

我有一个存储在resultlist中的列表,代码如下:\n

var resultlist = results.ToList();

\n它的样子大致如下:\nID 姓 名 姓 氏\n-- --------- --------\n1 Bill Smith\n2 John Wilson\n3 Doug Berg\n\n我该如何从列表中移除ID为2的项?

0
0 Comments

如何从C#中的列表中删除项目?

在C#中,有几种方法可以从列表中删除项目。我们来看看其中一种方法。

一种常见的方法是使用LINQ的Where方法来筛选出不符合条件的项目并创建一个新的列表。以下是一个示例:

resultList = results.Where(x => x.Id != 2).ToList();

这将返回一个新的列表resultList,其中不包含Id为2的项目。

另一种方法是使用LINQ的Except方法,它接受一个谓词(Predicate)作为参数。以下是一个示例:

public static IEnumerable ExceptWhere(this IEnumerable source, Predicate predicate)
{
    return source.Where(x => !predicate(x));
}
//在上述情况中使用的方法
resultList = results.ExceptWhere(x => x.Id == 2).ToList();

这个方法定义了一个扩展方法ExceptWhere,它接受一个谓词作为参数并返回一个新的列表,其中不包含满足谓词条件的项目。

另一种方法是使用List的FindIndex方法和RemoveAt方法。这两个方法都是可变操作,可以直接在原始列表上修改。以下是一个示例:

int index = results.FindIndex(x => x.Id == 2);
if (index != -1)
{
    results.RemoveAt(index);
}

这个方法首先使用FindIndex方法找到满足条件的项目的索引,然后使用RemoveAt方法将该项目从列表中移除。

需要注意的是,List的操作实际上是对其背后的数组进行修改。通常情况下,删除操作是在原始数组上进行的。

除了上述方法之外,还可以使用SingleOrDefault方法来移除列表中的项目。但需要注意的是,SingleOrDefault方法只能用于删除单个项目,而不是多个项目。

- 使用LINQ的Where方法可以根据条件筛选出不需要的项目,并创建一个新的列表。

- 使用LINQ的Except方法可以根据谓词条件筛选出不需要的项目,并创建一个新的列表。

- 使用List的FindIndex方法和RemoveAt方法可以直接在原始列表上修改并删除项目。

- 使用SingleOrDefault方法可以删除单个项目。

以上是从C#中的列表中删除项目的几种常见方法。根据具体情况选择合适的方法即可。

附注:除了上述方法之外,还可以使用Except方法。但是,Except方法需要一个特定的异常实例列表作为参数,并返回一个不包含任何异常实例的列表。而我所提供的代码根据谓词函数进行条件判断,可以与枚举类型中的任何对象进行比较。

0
0 Comments

如何从C#中的列表中删除项目?

简短回答:

从列表results中删除results.RemoveAll(r => r.ID == 2);将删除具有ID 2的项目(原地)。

筛选(而不从原始列表results中删除):var filtered = results.Where(f => f.ID != 2).ToList();返回除具有ID 2的项目之外的所有项目,然后可以通过filtered变量访问这些项目。列表results保持不变,仍然包含所有项目。

详细回答:

我认为.RemoveAll()非常灵活,因为您可以有一个要删除的项目ID列表-请参考以下示例。

如果您有:

class myClass {
    public int ID; public string FirstName; public string LastName;
}

并将一些值分配给results,如下所示(对于下面的所有示例都使用):

var results = new List {
    new myClass { ID=1, FirstName="Bill", LastName="Smith" },   // results[0]
    new myClass { ID=2, FirstName="John", LastName="Wilson" },  // results[1]
    new myClass { ID=3, FirstName="Doug", LastName="Berg" },    // results[2]
    new myClass { ID=4, FirstName="Bill", LastName="Wilson" }   // results[3]
};

然后,您可以定义要删除的ID列表:

var removeList = new List() { 2, 3 };

然后只需使用它们进行删除:

results.RemoveAll(r => removeList.Any(a => a==r.ID));

它将删除项目2和3,并保留项目1和4-如removeList指定的那样。请注意,这是原地发生的,因此不需要额外的赋值。

当然,您也可以将其用于单个项目,例如:

results.RemoveAll(r => r.ID==4);

在我们的示例中,它将删除具有ID 4的Bill。

最后要提到的是,列表具有索引器,即它们也可以像动态数组一样访问,即results[3]将为您提供结果列表中的第4个元素(因为第一个元素的索引为0,第二个元素的索引为1等)。

因此,如果要删除与结果列表中的第4个元素的FirstName相同的所有条目,您可以这样做:

results.RemoveAll(r => results[3].FirstName == r.FirstName);

请注意,之后,列表中仅剩下John和Doug,Bill被删除(示例中的第一个和最后一个元素)。重要的是,列表将自动缩小,因此只剩下2个元素-因此,在执行RemoveAll之后,允许的最大索引为1(即results.Count() - 1)。

一些趣闻:您可以使用这些知识并创建一个本地函数

void myRemove()  { var last = results.Count() - 1; 
                   results.RemoveAll(r => results[last].FirstName == r.FirstName); }

如果您调用两次该函数,您认为会发生什么?

例如

myRemove(); myRemove(); 

(假设在调用函数两次之前,列表results包含所有4个元素)

答案(点击显示):

第一次调用将删除第一个和最后一个位置的Bill,第二次调用将删除Doug,只有John Wilson保留在列表中。

注意:自从C# 8版以来,您也可以写results[^1],意思是results[results.Count() - 1],即上面的函数看起来简单得多:

void myRemove()  =>  results.RemoveAll(r => results[^1].FirstName == r.FirstName); 

因此,您不再需要局部变量last(请参阅索引和范围)。此外,由于它是一行代码,因此不需要大括号,并且可以使用=>而不是{}

有关C#中所有新功能的列表,请查看此处。

DotNetFiddle:运行演示

0
0 Comments

如何从C#中的列表中删除项目?

在C#中,可以使用List的两种方法来删除项目。如果您知道项目的索引,可以使用RemoveAt(int index)方法。例如:

resultlist.RemoveAt(1);

或者可以使用Remove(T item)方法:

var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);

当您不确定项目是否存在时,可以使用SingleOrDefault方法。SingleOrDefault方法在没有项目时会返回null(Single方法在找不到项目时会抛出异常)。当有重复值(两个具有相同id的项目)时,这两种方法都会抛出异常。

var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
    resultList.Remove(itemToRemove);

还可以使用Where方法找到所有符合条件的项目,并进行删除:

var itemsToRemove = resultlist.Where(r => r.Id == 2);
foreach (var itemToRemove in itemsToRemove)
    resultList.Remove(itemToRemove);

最后,有人建议使用`resultlist.Items.RemoveAt(1);`来删除项目,但这是错误的。

以上就是在C#中从列表中删除项目的方法。

0