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

时间:2011-11-21 13:33:57

标签: c#

有没有办法只使用LINQ从任何类型的集合(Control.Items,List ....)中删除除第一个项目之外的所有项目?

6 个答案:

答案 0 :(得分:4)

没有。 LINQ用于查询集合(无副作用),而不是用于添加或删除项目。

您可以做的是编写一个获取集合的第一个元素的查询:

var result = source.Take(1);

请注意,LINQ不适用于所有类型的集合;你需要一个LINQ提供程序来使LINQ工作。例如,source必须实现IEnumerable< T>使用Enumerable Class(LINQ-to-Objects)的扩展方法。

答案 1 :(得分:2)

使用反射的东西怎么样?

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);
}

答案 2 :(得分:0)

您可以使用.Take(1),但它会返回一个新的集合,并保留原始内容。

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

Jon Skeet对此主题发表评论:LINQ equivalent of foreach for IEnumerable<T>

答案 3 :(得分:0)

(在linq中):

var result = list.Where(l => l != list.First());

但这会更好:

var result = list.Take(1);

答案 4 :(得分:0)

        List<string> collection = new List<string>();
        collection.RemoveAll(p => p.StartsWith("something"));

答案 5 :(得分:0)

listXpto.Where(x=>true /* here goes your query */)
    .Select(x=>{listXpto.Remove(x); return null})

但我不知道它的真正用处。

请记住,remove方法适用于IList,而不是一般的IQueryable。