2016-07-22 46 views
0

如何在不知道集合類型的情況下從System.Collections.ICollection獲取一定數量的元素?從集合中抽取一定數量的元素

僞碼

System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; 

collection = collection.Take(2); 

/* collection == new[] { 8, 9 }; */ 

通常你應該能夠做到這一點與System.Linq.Take當枚舉

+0

'集合= collection.Take(2)'將無法編譯,因爲'Take'返回一個IEnumerable的'',即使是'IEnumerable',而不是'IEnumerable的'你還是不能重新分配它。 –

回答

2

你不得不Cast<T>()第一的價值觀。 LINQ(Take())只適用於泛型類型:

 System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; 

     collection = collection.Cast<int>().Take(2).ToList(); 

     /* collection == new[] { 8, 9 }; */ 
+1

或者更好的是,首先使用'ICollection '(不清楚是否有一個不存在的問題)。 –

+0

我的目標是在知道類型的情況下做到這一點。 – roydukkey

+1

'.Cast ().Take(2)'? – roydukkey

-1

我想補充一個不同的方法

System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; 
var _collection = collection as IEnumerable<int>; 
var result = _collection.Take(3); 

或者

System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; 
var enunmerator = collection.GetEnumerator(); 
int count = 0; 
while (enunmerator.MoveNext() && count < 3) 
    { 
       Console.WriteLine(enunmerator.Current); 
       count++; 
    } 
+0

'ICollection'繼承自'IEnumerable',但不是'IEnumerable '。因爲你知道你指定的具體值,你的演員只有有效,而不是任何給定的「ICollection」(即使它恰好只有整數)。 – Servy

+0

@Servy同意,感謝您的反饋,編輯。 –

1

你可以讓自己的非一般的擴展方法。

public static class ExtensionMethods 
{ 
    public static IEnumerable Take(this IEnumerable @this, int take) 
    { 

     var enumerator = @this.GetEnumerator(); 
     try 
     { 
      for (int i = 0; i < take && enumerator.MoveNext(); i++) 
      { 
       yield return enumerator.Current; 
      } 
     } 
     finally 
     { 
      var disposable = enumerator as IDisposable; 
      if(disposable != null) 
       disposable.Dispose(); 
     } 
    } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; 

     var result = collection.Take(2); 
     foreach (var item in result) 
     { 
      Console.WriteLine(item); 
     } 
     Console.ReadLine(); 

    } 
} 
+0

這很接近,但IEnumerable無法分配給ICollection。 – roydukkey

+0

@roydukkey你在你的問題中聲明:「當你使用可枚舉的」*「時,你通常可以用System.Linq.Take來做到這一點,但事實並非如此,你不能將'Take'的輸出分配給一個'ICollection ',您只能將其分配給'IEnumerable '。我認爲這個事實意味着你的「psudocode例子」不關心重新分配部分,只關心查詢部分。如果你真的比較'IEnumerable ',那麼你的''集合'應該是一個'System.Collections.IEnumerable'而不是'System.Collections.ICollection'可以比較。 –