我有一个列表存储在resultlist如下:
var resultlist = results.ToList();
它看起来是这样的:
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
我如何从列表中删除ID 2 ?
我有一个列表存储在resultlist如下:
var resultlist = results.ToList();
它看起来是这样的:
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
我如何从列表中删除ID 2 ?
当前回答
试试下面的代码:
resultlist.Remove(resultlist.Find(x => x.ID == 2));
其他回答
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();
... 或者只是resultlist.RemoveAt(1)如果你知道确切的索引。
List<T>有两个方法可以使用。
如果知道项的索引,可以使用RemoveAt(int index)。例如:
resultlist.RemoveAt(1);
或者你可以使用Remove(T项):
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);
你没有指定哪种类型的列表,但是通用列表可以使用RemoveAt(index)方法,也可以使用Remove(obj)方法:
// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);
// RemoveAt(index)
resultList.RemoveAt(1);
还有另一种方法。它使用List。FindIndex和List.RemoveAt。
虽然我可能会使用KeithS提供的解决方案(只是简单的Where/ToList),但这种方法的不同之处在于它改变了原始的列表对象。这可能是好事(也可能是坏事)“特性”取决于期望。
在任何情况下,FindIndex(加上一个保护)确保RemoveAt在id中有空白或顺序错误等情况下是正确的,并且使用RemoveAt (vs Remove)避免了在列表中进行第二次O(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
快乐的编码。