如何使用LINQ从集合中删除x项
本文关键字:删除 集合 何使用 LINQ | 更新日期: 2023-09-27 18:15:22
是否有一种方法可以仅使用LINQ从任何类型的集合(Control.items,List….(中删除除第一项之外的所有项?
否。LINQ是为查询集合而设计的(没有副作用(,而不是为添加或删除项而设计的。
您所能做的是编写一个查询,该查询采用集合的第一个元素:
var result = source.Take(1);
请注意,LINQ并不适用于所有类型的集合;您需要一个LINQ提供程序才能使LINQ正常工作。例如,source
必须实现IEnumerable<T>使用可枚举类(LINQ to Objects(的扩展方法。
使用反射怎么样?
static void RemoveButFirst(object o){
Type t = o.GetType();
System.Reflection.MethodInfo rm = t.GetMethod("RemoveAt",
new Type[]{typeof(int)});
System.Reflection.PropertyInfo count = t.GetProperty("Count");
for (int n = (int)(count.GetValue(o,null)) ; n>1; n--)
rm.Invoke(o, new object[]{n-1});
}
每当您的集合公开int Count
属性和RemoveAt(int)
方法时,这都会起作用,我认为这些集合应该这样做。
还有一个更简洁的版本,使用dynamic
,如果您使用C#4.0:
public static void RemoveBut(dynamic col, int k){
for (int n = col.Count; n>k; n--)
col.RemoveAt(n-1);
}
您可以使用.Take(1)
,但它会返回一个新集合,并保持原始集合不变。
LINQ的想法来自函数式编程,在函数式编程中,一切都是不可变的,因此,他们无法使用LINQ修改集合。
Jon Skeet对此有评论:LINQ相当于IEnumerable<T>
(在linq中(:怎么样
var result = list.Where(l => l != list.First());
但这会更好:
var result = list.Take(1);
List<string> collection = new List<string>();
collection.RemoveAll(p => p.StartsWith("something"));
listXpto.Where(x=>true /* here goes your query */)
.Select(x=>{listXpto.Remove(x); return null})
但我不知道它的真正效用。
请记住,remove方法适用于ILists,而不是一般的IQueryable。