如何在C#中从列表中删除项目?
如何从C#中的列表中删除项目?
在C#中,有几种方法可以从列表中删除项目。我们来看看其中一种方法。
一种常见的方法是使用LINQ的Where方法来筛选出不符合条件的项目并创建一个新的列表。以下是一个示例:
resultList = results.Where(x => x.Id != 2).ToList();
这将返回一个新的列表resultList,其中不包含Id为2的项目。
另一种方法是使用LINQ的Except方法,它接受一个谓词(Predicate)作为参数。以下是一个示例:
public static IEnumerableExceptWhere (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方法需要一个特定的异常实例列表作为参数,并返回一个不包含任何异常实例的列表。而我所提供的代码根据谓词函数进行条件判断,可以与枚举类型中的任何对象进行比较。
如何从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:运行演示
如何从C#中的列表中删除项目?
在C#中,可以使用List
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#中从列表中删除项目的方法。