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
将返回null
( Single
会在找不到项目时抛出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.FindIndex
和List.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)
如果你确切地知道索引。