如何使用LINQ从集合中删除x项

本文关键字:删除 集合 何使用 LINQ | 更新日期: 2023-09-27 18:15:22

是否有一种方法可以仅使用LINQ从任何类型的集合(Control.items,List….(中删除除第一项之外的所有项?

如何使用LINQ从集合中删除x项

否。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。