2012-04-04 38 views
96

我已经存储在resultlist名单如下:c# - 如何从列表中删除项目?

var resultlist = results.ToList(); 

它看起来是这样的

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

如何从列表中删除ID 2?

回答

188

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将在找不到项目时抛出异常)。当有重复值时,两者都会抛出(两个项目具有相同的id)。

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

好吧,也许'var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach(var itemToRemove in ItemsToRemove)resultList.Remove(itemToRemove);' – Vlad 2012-04-04 20:51:14

+0

不应该是'resultlist.Items.RemoveAt(1);'? – Obsidian 2016-10-17 08:57:48

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

有一个小的LINQ帮手我喜欢这样很容易实现,可以进行查询与“里没有”条件变得更轻松阅读:

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(); 
+1

另一个类似的方法(使用谓词)是使用'List.FindIndex' /'List.RemoteAt'(它具有“漂亮”或“不那么好”作为变异操作的特征)。 – 2012-04-04 20:50:05

+0

是的,但要小心说List的操作*是*变异的。 List在幕后使用一个数组,当它认为有必要时,它可以用更小或更大的容量重新创建它的数组。 *通常*,移除是现有数组的原地变异。 – KeithS 2012-04-04 21:09:52

+0

这是线程安全的,为简单起见,你可以使用SingleOrDefault,它不需要包含在静态方法中 – 2013-08-27 20:08:40

0

...或只是resultlist.RemoveAt(1),如果你知道恰恰是指数。

+2

只有按照“ID”排序。 – zzzzBov 2012-04-04 20:47:13

3

不指定什么样的名单,但泛型列表可以使用的RemoveAt(index)方法,或Remove(obj)方法:

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

// RemoveAt(index) 
resultList.RemoveAt(1); 
4

还有一个办法。它使用List.FindIndexList.RemoveAt

虽然我可能使用由KeithS提出的解决方案(只是简单的Where/ToList)这种方法的不同之处在于它变异原始列表对象。根据预期,这可能是一个好的(或不好的)“特征”。如果在的ID间隙或顺序是错误的,等等,以及使用RemoveAt(VS Remove

在任何情况下,FindIndex(加上保护)确保RemoveAt将是正确避免了ö (n)在列表中搜索。

这里是一个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 

编码愉快。

8

简短的回答:
results.RemoveAll(r => r.ID==2);resultsID 2删除项目(到位)。

详细的解答:

我认为这是简单的使用.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。


DotNetFiddle:Run the demo

2

更简单:

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

没有需要创建一个新的变种对象。