2009-09-26 72 views
8

因此,很多時候我們有一個接受IEnumerable或ICollection作爲參數的函數。在這裏我們有單品的情況下,卻沒有收集追究他們,我們必須將它們傳遞給函數,像以前一樣創建一個集合:創建IEnumerable <T>或ICollection <T>的最簡單和最簡單的方法是什麼?

T o1, o2, o3; 
Foo(new T[] { o1, o2, o3 }); 

我總是創建一個數組或列表,像我在最後一個例子中已經完成了。但是我想知道,是否有更好的方法來創建所需的IEnumerable或ICollection?

這將是相當冷靜,如果能做到這一點:

Foo({ o1, o2, o3 }); 

,編譯器會創建最抽象的可能集合將滿足的IEnumerable或ICollection的需求(取決於哪一個函數接受)。

無論如何,你如何將o1,o2和o3傳遞給IEnumerable或ICollection參數?

回答

10

的C#(3)當前版本支持的符號沒有明確的類型,即

Foo(new [] { o1, o2, o3 }) 

創建一個數組。還有Linq的Enumerable.Range創建連續範圍的數字。其他一切都必須執行。在Java中的精神:

public static IEnumerable<T> AsList<T>(params T[] values) { 
    return values; 
} 

被稱爲像這樣:

Foo(Enumerable.AsList(o1, o2, o3)); 
+1

我建議'AsList()'是不是一個好名字,它返回一個'Enumerable',不'List'的方法! 'Enumerable.Create'如何? – 2013-02-01 19:08:46

2

假定富預計一個IEnumerable <Ť>,可以利用類型推斷的並做:

T o1, o2, o3; 
Foo(new []{o1, o2, o3}); 
3

有時我用的方法與 「PARAMS」 的說法。

Foo(params T[] ts) 

如果我在IEnumerable上設置了死鎖,那麼我只需要將該方法委託給需要IEnumerable的那個方法。

Foo(params T[] ts) { Foo(ts.AsEnumerable()); } 

你必須調用AsEnumerable或者你要遞歸。

2

創建一個數組並傳遞它可能是在當前版本的C#中完成此操作的最簡單/最優雅的方法。您可以利用隱含陣列類型(即new[] { ... },但這是儘可能去

我懷疑你真正想要的C#相當於這個F#的語法:

let foo = seq [ o1; o2; o3 ] 

產生的('Seq'實際上是'IEnumerable'的F#別名,儘管F#內置了對它們的支持。)

不幸的是,由於這是一個很大的功能概念,沒有C#相當於 - 儘管誰知道它何時會被添加,因爲C#變得越來越有趣虛構的。

0

如果您有將數組作爲其最後一個參數的方法,那麼標記該參數params可能是有意義的。這使您可以這樣調用方法:

Foo(o1, o2, o3); 

我覺得這是特別有幫助的Foo()編寫單元測試時,因爲經常在單元測試我的參數是分開的這個樣子,而不是在一個陣列。

我建議不要這樣做,如果Foo()的過載不會在該位置使用陣列,因爲它可能會很快混淆。

我不希望C#語言允許paramsIList<T>

void Foo(params IList<T> ts) { ... } 
相關問題