2016-06-28 157 views
2

我創建了一些擴展方法,我想在不同的集合上使用這些擴展方法,主要是那些實現IList和數組集合[]當我創建一個擴展方法時,我需要創建2而不是1,以便它可以同時爲通用擴展方法C#

public static IList<T> Shuffle<T>(this IList<T> inputCollection) 
    { 

    } 

    public static T[] Shuffle<T>(this T[] inputCollection) 
    { 

    } 

工作我的大多數方法需要與索引工作,所以我不能用IEnumerable是沒有辦法,我可以寫僅有1擴展方法,並用它爲雙方所期望的藏品一些其他的方式?有時我也使用string這是另一種方法。

+0

如果你要返回一個新的集合,那麼IEnumerable <>就足夠了。但是,你確實不想這麼做,所以ICollection <>是正確的。 –

+2

數組實現'IList ',所以你可能不需要其中的一個(取決於實現)。 –

+0

選項1是使用由數組和'List '實現的非泛型'IList'接口,另一個選項是爲實現IList 的數組創建包裝,但是可以從下層數組讀取和寫入,在array ext方法中,您可以'new包裝(數組).ListExtMethod()' – csharpfolk

回答

6

您可以嘗試

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> value) 

簽名;並用它

IList<T> list = Shuffle(myList).ToList(); 
T[] array = Shuffle(myArray).ToArray(); 

甚至

IList<T> list = myList.Shuffle().ToList(); 
T[] array = myArray.Shuffle().ToArray(); 
+0

但是,如果我使用'這個IEnumerable 價值'我不能申請索引在我的方法。 – PreqlSusSpermaOhranitel

+0

@PreqlSusSpermaOhranitel:把它翻譯成數組,例如:T [] data = value.ToArray();' –

+0

偉大的解決了我的問題! – PreqlSusSpermaOhranitel

0

我會建議使用這種擴展方法,因爲所有的List對象從IEnumerable繼承。

public static IEnumerable<T> MethodName<T>(this IEnumerable<T> value)