我有一个列表存储在resultlist中,如下所示:
var resultlist = results.ToList();
它看起来像这样:
ID FirstName LastName
-- --------- --------
1 Bill Smith
2 John Wilson
3 Doug Berg
如何从列表中删除ID 2?
答案 0 :(得分:281)
List<T>
有两种方法可以使用。
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);
答案 1 :(得分:37)
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();
答案 2 :(得分:26)
简答:
删除(从列表results
)
results.RemoveAll(r => r.ID == 2);
将删除results
中的 ID 2 项目(就地)。
过滤(不从原始列表中删除results
):
var filtered = result.Where(f => f.ID != 2);
会返回除 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
指定。 注意这种情况会发生,所以不需要额外的分配。
当然,您也可以在以下单品上使用它:
results.RemoveAll(r => r.ID==4);
在我们的示例中,它将删除ID为4的Bill。
DotNetFiddle:Run the demo
答案 3 :(得分:5)
还有另一种方法。它使用List.FindIndex
和List.RemoveAt
。
虽然我可能使用KeithS提供的解决方案(只是简单的Where
/ ToList
),但这种方法的不同之处在于 mutates 原始列表对象。根据期望,这可能是一个好的(或坏的)“特征”。
在任何情况下,如果ID中存在空白或排序错误等,并使用{{1},FindIndex
(加上一个警卫)可确保RemoveAt
正确无误}(vs RemoveAt
)避免在列表中进行第二次 O(n)搜索。
以下是LINQPad摘要:
Remove
快乐的编码。
答案 4 :(得分:3)
您没有指定何种类型的列表,但通用列表可以使用RemoveAt(index)
方法或Remove(obj)
方法:
// Remove(obj)
var item = resultList.Single(x => x.Id == 2);
resultList.Remove(item);
// RemoveAt(index)
resultList.RemoveAt(1);
答案 5 :(得分:3)
更简化:
resultList.Remove(resultList.Single(x => x.Id == 2));
无需创建新的var对象。
答案 6 :(得分:0)
...如果您确切知道索引,则只需resultlist.RemoveAt(1)
。
答案 7 :(得分:0)
{
class Program
{
public static List<Product> list;
static void Main(string[] args)
{
list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};
Console.WriteLine("Enter ProductID to remove");
int uno = Convert.ToInt32(Console.ReadLine());
var itemToRemove = list.Find(r => r.ProductId == uno);
if (itemToRemove != null)
list.Remove(itemToRemove);
Console.WriteLine($"{itemToRemove.ProductId}{itemToRemove.Name}{itemToRemove.Brand}{itemToRemove.Price}{ itemToRemove.Quantity}");
Console.WriteLine("------------sucessfully Removed---------------");
var query2 = from x in list select x;
foreach (var item in query2)
{
/*Console.WriteLine(item.ProductId+" "+item.Name+" "+item.Brand+" "+item.Price+" "+item.Quantity );*/
Console.WriteLine($"{item.ProductId}{item.Name}{item.Brand}{item.Price}{ item.Quantity}");
}
}
}
}