我已经存储在resultlist名单如下:c# - 如何从列表中删除项目?
var resultlist = results.ToList();
它看起来是这样的
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
如何从列表中删除ID 2?
我已经存储在resultlist名单如下: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
将在找不到项目时抛出异常)。当有重复值时,两者都会抛出(两个项目具有相同的id
)。
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2);
if (itemToRemove != null)
resultList.Remove(itemToRemove);
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();
另一个类似的方法(使用谓词)是使用'List.FindIndex' /'List.RemoteAt'(它具有“漂亮”或“不那么好”作为变异操作的特征)。 – 2012-04-04 20:50:05
是的,但要小心说List的操作*是*变异的。 List在幕后使用一个数组,当它认为有必要时,它可以用更小或更大的容量重新创建它的数组。 *通常*,移除是现有数组的原地变异。 – KeithS 2012-04-04 21:09:52
这是线程安全的,为简单起见,你可以使用SingleOrDefault,它不需要包含在静态方法中 – 2013-08-27 20:08:40
不指定什么样的名单,但泛型列表可以使用的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
)这种方法的不同之处在于它变异原始列表对象。根据预期,这可能是一个好的(或不好的)“特征”。如果在的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
编码愉快。
简短的回答:
results.RemoveAll(r => r.ID==2);
将results
与ID 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
更简单:
resultList.Remove(resultList.Single(x => x.Id == 2));
没有需要创建一个新的变种对象。
好吧,也许'var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach(var itemToRemove in ItemsToRemove)resultList.Remove(itemToRemove);' – Vlad 2012-04-04 20:51:14
不应该是'resultlist.Items.RemoveAt(1);'? – Obsidian 2016-10-17 08:57:48