我在resultlist中存储了一个列表,如下所示:
var resultlist = results.ToList();
它看起来像这样:
ID FirstName LastName -- --------- -------- 1 Bill Smith 2 John Wilson 3 Doug Berg
如何从列表中删除ID 2?
g52tjvyc1#
List<T>有两种方法可以使用。如果知道项的索引,则可以使用RemoveAt(int index)。例如:
List<T>
resultlist.RemoveAt(1);
也可以使用Remove(T item):
var itemToRemove = resultlist.Single(r => r.Id == 2); resultList.Remove(itemToRemove);
当你不确定条目是否存在时,可以使用SingleOrDefault。如果没有条目,SingleOrDefault将返回null(Single在找不到条目时将抛出异常)。当存在重复值时(两个条目具有相同的id),两者都将抛出。
SingleOrDefault
null
Single
id
var itemToRemove = resultlist.SingleOrDefault(r => r.Id == 2); if (itemToRemove != null) resultList.Remove(itemToRemove);
scyqe7ek2#
简短答复:删除(从列表results中)
results
results.RemoveAll(r => r.ID == 2);将删除results中ID为2的项(在适当位置)。
results.RemoveAll(r => r.ID == 2);
筛选器(不从原始列表results中删除):
var filtered = result.Where(f => f.ID != 2);返回除ID为2的项之外的所有项
var filtered = result.Where(f => f.ID != 2);
详细答案:
我认为**.RemoveAll()**非常灵活,因为您可以拥有一个您想要删除的条目ID列表-请考虑以下示例。如果您有:
.RemoveAll()
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" }, // results[0] new myClass { ID=2, FirstName="John", LastName="Wilson" }, // results[1] new myClass { ID=3, FirstName="Doug", LastName="Berg" }, // results[2] new myClass { ID=4, FirstName="Bill", LastName="Wilson" } // results[3] };
然后,您可以定义要删除的ID列表:
var removeList = new List<int>() { 2, 3 };
只需使用以下命令即可删除它们:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
它将删除项目2和3并保留项目1和4 -如removeList所指定的。注意这是在适当的位置发生的,因此不需要额外的分配。当然,您也可以在单个项目上使用它,如:
removeList
results.RemoveAll(r => r.ID==4);
在这里它将删除我们示例中ID为4的Bill。最后要提到的是列表有一个索引器,也就是说,它们也可以像动态数组一样被访问,即results[3]将给予你结果列表中的第4个元素(因为第一个元素的索引为0,第二个元素的索引为1,以此类推)。因此,如果您想删除名字与结果列表第4个元素中的名字相同的所有条目,您可以简单地这样做:
results[3]
results.RemoveAll(r => results[3].FirstName == r.FirstName);
注意,之后,只有John和Doug将保留在列表中,Bill将被移除(示例中的第一个和最后一个元素)。重要的是,列表将自动收缩,因此它只剩下2个元素-因此,在本示例中,在执行RemoveAll之后允许的最大索引是1(即results.Count() - 1)。一些琐事:您可以利用这些知识创建局部函数
results.Count() - 1
void myRemove() { var last = results.Count() - 1; results.RemoveAll(r => results[last].FirstName == r.FirstName); }
如果你调用这个函数两次,你认为会发生什么?
myRemove(); myRemove();
第一次调用将删除第一个和最后一个位置的Bill,第二次调用将删除Doug,只有John Wilson保留在列表中。
**注意:**由于C# Version 8,您也可以写入results[^1],而不是var last = results.Count() - 1;和results[last]:
results[^1]
var last = results.Count() - 1;
results[last]
void myRemove() => results.RemoveAll(r => results[^1].FirstName == r.FirstName);
所以你不再需要局部变量last(见索引和范围)。此外,因为它是一行程序,你不需要花括号,可以用=>代替。要查看C#中所有新特性的列表,请查看here。点网小提琴:Run the demo
last
=>
wwodge7n3#
resultList = results.Where(x=>x.Id != 2).ToList();
有一个我喜欢的Linq helper,它很容易实现,可以使带有“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();
9o685dep4#
您不必指定列表的类型,但是泛型List可以使用RemoveAt(index)方法或Remove(obj)方法:
RemoveAt(index)
Remove(obj)
// Remove(obj) var item = resultList.Single(x => x.Id == 2); resultList.Remove(item); // RemoveAt(index) resultList.RemoveAt(1);
nmpmafwu5#
更简化:
resultList.Remove(resultList.Single(x => x.Id == 2));
不需要创建新的VAR对象。
t0ybt7op6#
还有另一种方法,它使用List.FindIndex和List.RemoveAt。虽然我 * 可能 * 会使用KeithS提出的解决方案(只是简单的Where/ToList),但这种方法的不同之处在于它 * 变异 * 了原始列表对象,这可能是一个好的(或坏的)“特性”,取决于预期。在任何情况下,FindIndex(与保护耦合)确保如果ID中存在间隙或排序错误等,则RemoveAt将是正确的,并且使用RemoveAt(与Remove相比)避免了对列表的 * 第二次 * O(n)搜索。下面是一个LINQPad代码片段:
List.FindIndex
List.RemoveAt
Where
ToList
FindIndex
RemoveAt
Remove
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
编程愉快。
e3bfsja27#
请尝试以下代码:
resultlist.Remove(resultlist.Find(x => x.ID == 2));
lvmkulzt8#
...或者如果您确切知道索引,则只需resultlist.RemoveAt(1)。
resultlist.RemoveAt(1)
px9o7tmv9#
{ 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}"); } } } }
9条答案
按热度按时间g52tjvyc1#
List<T>
有两种方法可以使用。如果知道项的索引,则可以使用RemoveAt(int index)。例如:
也可以使用Remove(T item):
当你不确定条目是否存在时,可以使用SingleOrDefault。如果没有条目,
SingleOrDefault
将返回null
(Single
在找不到条目时将抛出异常)。当存在重复值时(两个条目具有相同的id
),两者都将抛出。scyqe7ek2#
简短答复:
删除(从列表
results
中)results.RemoveAll(r => r.ID == 2);
将删除results
中ID为2的项(在适当位置)。筛选器(不从原始列表
results
中删除):var filtered = result.Where(f => f.ID != 2);
返回除ID为2的项之外的所有项详细答案:
我认为**
.RemoveAll()
**非常灵活,因为您可以拥有一个您想要删除的条目ID列表-请考虑以下示例。如果您有:
并将一些值分配给
results
如下:然后,您可以定义要删除的ID列表:
只需使用以下命令即可删除它们:
它将删除项目2和3并保留项目1和4 -如
removeList
所指定的。注意这是在适当的位置发生的,因此不需要额外的分配。当然,您也可以在单个项目上使用它,如:
在这里它将删除我们示例中ID为4的Bill。
最后要提到的是列表有一个索引器,也就是说,它们也可以像动态数组一样被访问,即
results[3]
将给予你结果列表中的第4个元素(因为第一个元素的索引为0,第二个元素的索引为1,以此类推)。因此,如果您想删除名字与结果列表第4个元素中的名字相同的所有条目,您可以简单地这样做:
注意,之后,只有John和Doug将保留在列表中,Bill将被移除(示例中的第一个和最后一个元素)。重要的是,列表将自动收缩,因此它只剩下2个元素-因此,在本示例中,在执行RemoveAll之后允许的最大索引是1
(即
results.Count() - 1
)。一些琐事:您可以利用这些知识创建局部函数
如果你调用这个函数两次,你认为会发生什么?
第一次调用将删除第一个和最后一个位置的Bill,第二次调用将删除Doug,只有John Wilson保留在列表中。
**注意:**由于C# Version 8,您也可以写入
results[^1]
,而不是var last = results.Count() - 1;
和results[last]
:所以你不再需要局部变量
last
(见索引和范围)。此外,因为它是一行程序,你不需要花括号,可以用=>
代替。要查看C#中所有新特性的列表,请查看here。点网小提琴:Run the demo
wwodge7n3#
有一个我喜欢的Linq helper,它很容易实现,可以使带有“where not”条件的查询更容易阅读:
9o685dep4#
您不必指定列表的类型,但是泛型List可以使用
RemoveAt(index)
方法或Remove(obj)
方法:nmpmafwu5#
更简化:
不需要创建新的VAR对象。
t0ybt7op6#
还有另一种方法,它使用
List.FindIndex
和List.RemoveAt
。虽然我 * 可能 * 会使用KeithS提出的解决方案(只是简单的
Where
/ToList
),但这种方法的不同之处在于它 * 变异 * 了原始列表对象,这可能是一个好的(或坏的)“特性”,取决于预期。在任何情况下,
FindIndex
(与保护耦合)确保如果ID中存在间隙或排序错误等,则RemoveAt
将是正确的,并且使用RemoveAt
(与Remove
相比)避免了对列表的 * 第二次 * O(n)搜索。下面是一个LINQPad代码片段:
编程愉快。
e3bfsja27#
请尝试以下代码:
lvmkulzt8#
...或者如果您确切知道索引,则只需
resultlist.RemoveAt(1)
。px9o7tmv9#