2012-10-09 51 views
0

這是一個簡單的問題,但我真的不知道如何有效地做到這一點。是否有任何方法可以將數值列表有效地轉換爲數組,例如List<int>int[]List<CustomObj>CustomObj[],而不使用循環,最好使用Linq?如何分配LINQ查詢結果到自定義集合和轉換列表<T>到T []

此外,我有一個GenericCollection<T>,我怎麼能直接轉換Linq查詢GenericCollection<T>沒有循環例如,

GenericCollection<T> result = SomeGenericCollection.Select(o => o).ToList<GenericCollection<T>>(); 
+3

在'List'對象的末尾按'.',然後按'CTRL +空格',它會在列表中爲您列出intellisense,並且您將尋找您想要達到的目標 - 所有冰雹intellisense。 – LukeHennerley

+0

已經有這個問題了[鏈接](http://stackoverflow.com/questions/629178/c-sharp-conversion-from-listt-to-array-of-tt) – andy

+1

有一個ToArray方法, :http://msdn.microsoft.com/en-us/library/bb298736.aspx – Oosterman

回答

0

你的問題的第一部分,看看ToArray()方法按其他的答案:

對於第二部分中,您可以編寫自己的擴展方法

var result = SomeGenericCollection.Select(o => o).ToGenericCollection(); 

你真的無法避免必須編寫循環,但這種方式你只需要編寫一次。

+0

感謝您的回答,儘管我使用了類似的方法。很奇怪,如果Linq不提供將IEnumerable 的結果直接分配給GenericCollection 的方式,因爲GenericCollection是從IEnumerable派生的?我們不能避免循環而沒有我們自己的擴展方法嗎? –

+0

@FurqanSafdar你不能避免循環,沒有。 for循環可能隱藏在(框架或自定義)方法中,但它始終存在。 – jeroenh

2

嘗試使用Linqs .ToArray()方法

2

嗯,關於使用ToArray()擴展方法如何。

var intList = new List<int> { 1, 2, 3 }; 
int[] intArray = intList.ToArray(); 

在回答擴展的問題,如果GenericCollection<T>實現IEnumerable<T>,和你有一個查詢,返回一個IEnumerable<IEnumerable<T>>或協變型類似, IList<GenericCollection<T>>你可以做,

IEnumerable<T> flat = SomeGenericCollectionCollection<T>.SelectMany(o => o) 

癥結在於o本身就是IEnumerable<T>

+0

@abatishchev,爲了平息你的瑣事,延伸是延伸的東西。所以擴展方法是.Net框架的擴展。我已經按照要求使用了特定的專有名詞,而不是通用術語。 – Jodrell

+0

如果需要,擴展方法是C#/ VB.NET編譯器的擴展,作爲語法糖。但不是.NET Framework的擴展。 – abatishchev

2

您只需使用ToArray()擴展方法即可。

1

只要做到這樣,在列表中使用的ToArray:

List<string> l = new List<string> { "one", "two", "three", "four", "five" }; 

string[] s = l.ToArray(); 
+1

我寧願用一個有意義的名稱和'IList '或者'var'聲明'l'。 – Jodrell

1
List<int> l = ... 
int [] s = l.ToArray() 
1

您可以ToArray() LINQ方法做到這一點。

List<int> lst = new List<int>(); 
int arr[] = lst.ToArray(); 
0

GenericCollection<T>實現IEnumerable<T>所以ToArray()擴展方法應該爲你工作。

如果不嘗試以下方法:

using System.Linq; 

GenericCollection<T> gc = ... 
T[] arr = ((IEnumerable<T>)gc).ToArray(); 

T[] arr = new List<T>(gc).ToArray();