有没有办法只使用LINQ从任何类型的集合(Control.Items,List ....)中删除除第一个项目之外的所有项目?
答案 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。