我有一个列表存储在resultlist中,如下所示:
var resultlist = results.ToList();
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
Run Code Online (Sandbox Code Playgroud)
如何从列表中删除ID 2?
Wou*_*ort 326
List<T> 有两种方法可以使用.
如果您知道项目的索引,则可以使用RemoveAt(int index).例如:
resultlist.RemoveAt(1);
Run Code Online (Sandbox Code Playgroud)
或者你可以使用Remove(T item):
var itemToRemove = resultlist.Single(r => r.Id == 2);
resultList.Remove(itemToRemove);
Run Code Online (Sandbox Code Playgroud)
如果您不确定该项目是否确实存在,则可以使用SingleOrDefault.如果没有项目SingleOrDefault将返回null(Single当它找不到项目时将抛出异常).当存在重复值时两者都会抛出(两个具有相同的项id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
resultList.Remove(itemToRemove);
Run Code Online (Sandbox Code Playgroud)
Kei*_*thS 39
resultList = results.Where(x=>x.Id != 2).ToList();
Run Code Online (Sandbox Code Playgroud)
有一个我喜欢的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();
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 34
简短回答:
删除(从列表中results)
results.RemoveAll(r => r.ID == 2);将删除的项与ID 2在results(在适当位置).
过滤(不从原始列表中删除results):
var filtered = result.Where(f => f.ID != 2);返回除ID 2之外的所有项目
详细解答:
我认为.RemoveAll()非常灵活,因为您可以拥有要删除的项目ID列表 - 请参阅以下示例.
如果你有:
class myClass {
public int ID; public string FirstName; public string LastName;
}
Run Code Online (Sandbox Code Playgroud)
并指定了一些值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" },
};
Run Code Online (Sandbox Code Playgroud)
然后,您可以定义要删除的ID列表:
var removeList = new List<int>() { 2, 3 };
Run Code Online (Sandbox Code Playgroud)
只需使用它来删除它们:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
它将删除项目2和3,并保留项目1和4 - 由指定removeList.请注意,这种情况发生在适当的位置,因此不需要额外的分配.
当然,您也可以在单个项目上使用它,例如:
results.RemoveAll(r => r.ID==4);
Run Code Online (Sandbox Code Playgroud)
在我们的示例中,它将删除ID为4的Bill.
DotNetFiddle:运行演示
您不指定哪种列表,但泛型 List 可以使用RemoveAt(index)方法或Remove(obj)方法:
// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);
// RemoveAt(index)
resultList.RemoveAt(1);
Run Code Online (Sandbox Code Playgroud)
小智 5
还有另一种方法。它使用List.FindIndex和List.RemoveAt。
虽然我可能会使用KeithS提出的解决方案(只是简单的Where/ ToList),但这种方法的不同之处在于它会改变原始列表对象。根据期望,这可能是一个好(或坏)的“功能”。
在任何情况下,如果ID上有空格或顺序错误等,FindIndex(加上防护)RemoveAt都将确保正确,并且使用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
Run Code Online (Sandbox Code Playgroud)
快乐的编码。
小智 5
更简化:
resultList.Remove(resultList.Single(x => x.Id == 2));
Run Code Online (Sandbox Code Playgroud)
无需创建新的 var 对象。
试试这个代码:
resultlist.Remove(resultlist.Find(x => x.ID == 2));
Run Code Online (Sandbox Code Playgroud)