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

C# 如何使用LINQ从集合中删除x项?,c#,C#,是否有方法从任何类型的集合控件中删除除第一个之外的所有项。项,列表。。。。仅使用LINQ?使用反射怎么样 static void RemoveButFirst(object o){ Type t = o.GetType(); System.Reflection.MethodInfo rm = t.GetMethod("RemoveAt", new Type[]{typeof(in

是否有方法从任何类型的集合控件中删除除第一个之外的所有项。项,列表。。。。仅使用LINQ?

使用反射怎么样

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属性和RemoveAtint方法时,这都会起作用,我认为这些集合应该这样做

以及更简洁的版本,如果您使用C 4.0,请使用:

public static void RemoveBut(dynamic col, int k){
    for (int n = col.Count; n>k; n--)
        col.RemoveAt(n-1);
}
您可以使用.Take1,但它会返回一个新集合,并保持原始集合不变

LINQ的思想来自函数式编程,在函数式编程中,一切都是不可变的,因此,他们无法使用LINQ修改集合

乔恩·斯基特对此发表了评论:

在林克怎么样:

var result = list.Where(l => l != list.First());
但这会更好:

var result = list.Take(1);

否。LINQ是为查询集合而设计的,没有副作用,也不用于添加或删除项目

您可以做的是编写一个查询,该查询采用集合的第一个元素:

var result = source.Take(1);
请注意,LINQ并不适用于所有类型的集合;您需要一个LINQ提供者才能使LINQ工作。例如,源必须实现IEnumerable才能使用LINQ to对象的扩展方法

        List<string> collection = new List<string>();
        collection.RemoveAll(p => p.StartsWith("something"));
但我不知道这有什么用


请记住,删除方法是针对ILists的,通常不可IQueryable。

首先是唯一的方法,然后是其他方法?LINQ并不是真正用于从列表中删除项目的。它是一种查询语言,因此设计用于从列表中选择项目。然后在LINQ..Take1之外执行删除操作,尽管这不会将其从原始文件中删除。@Emaad Ali,所有项目都是unique@GeorgeDuckett,我也可以使用Skip1,但是有没有办法用同一个调用删除其余的?它选择一个项目。我需要删除除第一个之外的所有使用反射的创造性解决方案,但我可能会坚持使用简单循环…如果只需要在代码中执行一次,那么简单循环将更有效。此解决方案适用于需要多次执行的令人沮丧的情况。因此,删除的唯一方法是使用object p的某个值?使用索引无法删除?值得注意的是,“所有集合类型”都不存在RemoveAll,而且它也不使用LINQ。@eugeneK您可以使用removeAt,但它只能删除1项。@George Duckett是的,它不使用LINQ。但linq只是用于查询。对于列表有RemoveAll方法。我知道,但你可能想在答案中指出,正如在他的文章中所做的那样,dtb。
listXpto.Where(x=>true /* here goes your query */)
    .Select(x=>{listXpto.Remove(x); return null})