2011-11-21 56 views
2

有沒有辦法從任何類型的集合(Control.Items,List ....)中僅使用LINQ刪除除第一個以外的所有項目?如何使用LINQ從集合中刪除x項目?

+0

第一個獨特然後別人? –

+6

LINQ並非真正用於從列表中刪除項目。這是一種查詢語言,因此旨在從列表中選擇項目。然後在LINQ之外完成刪除。 – Jens

+0

'。拿(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); 
} 
+0

它選擇一個項目。我需要刪除所有除了第一個 – eugeneK

+0

@eugeneK修改了我的答案。 – Vlad

+0

感謝創造性的解決方案使用反射,但我可能堅持簡單的循環... – eugeneK

0

您可以使用.Take(1),但它返回一個新的集合,並保留原來的不變。

LINQ的想法來自函數式編程,其中一切都是不可變的,因此,他們不能用LINQ修改集合。

喬恩斯基特對這個問題的評論:LINQ equivalent of foreach for IEnumerable<T>

0

如何(在LINQ):

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

但是,這會更好:

var result = list.Take(1); 
4

號LINQ設計用於查詢集合(無副作用),不用於添加或刪除項目。

你可以做的是寫一個查詢,需要收集的第一個元素:

var result = source.Take(1); 

注意,LINQ並不適用於所有類型的集合的工作;你需要一個LINQ提供者來使LINQ工作。例如,source必須實現IEnumerable <T>才能使用Enumerable Class(LINQ-to-Objects)的擴展方法。

+0

那麼我沒有別的選擇...無論如何,謝謝 – eugeneK

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

所以唯一的方法是刪除使用對象p的一些值?有沒有辦法刪除使用索引? – eugeneK

+1

值得注意的是'RemoveAll'對於'所有集合類型'都不存在,並且不使用LINQ。 –

+0

@eugeneK您可以使用removeAt(),但它只能刪除1個項目。 – shenhengbin

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

但我不知道的,真正的效用。

請記住,remove方法是針對ILists的,而不是一般的IQueryable。

相關問題