c#从列表中删除项目

我有一个列表存储在结果列表如下:

var resultlist = results.ToList(); 

看起来像这样

 ID FirstName LastName -- --------- -------- 1 Bill Smith 2 John Wilson 3 Doug Berg 

如何从列表中删除ID 2?

List<T>有两种方法可以使用。

如果您知道项目的索引,则可以使用RemoveAt(int index) 。 例如:

 resultlist.RemoveAt(1); 

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

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

如果您不确定该项目是否存在,则可以使用SingleOrDefault 。 如果没有项目, SingleOrDefault将返回nullSingle会在找不到项目时抛出exception)。 当有重复的值时(两个具有相同id项目),两者都会抛出。

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

有一个我喜欢的Linq帮手,很容易实现,并且可以使用“where not”条件来查询:

 public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate) { return source.Where(x=>!predicate(x)); } //usage in above situation resultList = results.ExceptWhere(x=>x.Id == 2).ToList(); 

我认为使用.RemoveAll()更简单,因为您可以拥有要删除的项目ID列表 – 请参考以下示例。

如果你有:

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

并将results赋值如下:

 var results=new List<myClass> { new myClass() { ID=1, FirstName="Bill", LastName="Smith" }, new myClass() { ID=2, FirstName="John", LastName="Wilson" }, new myClass() { ID=3, FirstName="Doug", LastName="Berg" }, new myClass() { ID=4, FirstName="Bill", LastName="Wilson" }, }; 

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

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

只需使用它来删除它们:

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

它将删除项目2和3,并保留项目1和项目4 – 如removeList所指定的。 请注意 ,这发生的地方,所以没有额外的assigment要求。

当然,你也可以在单个项目上使用它,例如:

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

在我们的例子中它将删除ID为4的Bill。


DotNetFiddle: 运行演示

还有另一种方法。 它使用List.FindIndexList.RemoveAt

虽然我可能使用KeithS提供的解决scheme(只是简单的Where / ToList ),但这种方法的不同之处在于它会改变原始列表对象。 根据预期,这可能是一个好的(或不好的)“特征”。

在任何情况下, FindIndex (加上一个警卫)确保RemoveAt将是正确的,如果有空白的ID或sorting是错误的,等等,使用RemoveAt (vs Remove )避免了第二个 O(n)search名单。

这是一个LINQPad片段:

 var list = new List<int> { 1, 3, 2 }; var index = list.FindIndex(i => i == 2); // like Where/Single if (index >= 0) { // ensure item found list.RemoveAt(index); } list.Dump(); // results -> 1, 3 

快乐的编码。

您不指定什么样的列表,但通用List可以使用RemoveAt(index)方法或Remove(obj)方法:

 // Remove(obj) var item = resultList.Single(x => x.Id == 2); resultList.Remove(item); // RemoveAt(index) resultList.RemoveAt(1); 

更简化:

 resultList.Remove(resultList.Single(x => x.Id == 2)); 

没有必要创build一个新的var对象。

…或只是resultlist.RemoveAt(1)如果你确切地知道索引。