2012-06-22 123 views
7

所有,我心智(這不是問題)。我想List<string[]>轉換爲List<object[]>C#列表<string[]>至列表<object[]>轉換

List<string[]> parameters = GetParameters(tmpConn, name); 
List<object[]> objParams = parameters.OfType<object[]>(); 

這是行不通的,但除非我已經忘了什麼使用這種方法的轉換應該是可能的(沒有lambda表達式需要)?

謝謝你的時間。

+1

'... OfType ()' – 2012-06-22 18:54:08

回答

16

你想使用類似:

List<object[]> objParams = parameters.OfType<object[]>().ToList(); 

或C#4.0,只是

List<object[]> objParams = parameters.ToList<object[]>(); 

List<object[]> objParams = parameters.ConvertAll(s => (object[])s); 
+1

太傻了。謝謝你,花了很長的一個星期五... – MoonKnight

3

OfType<string[]>返回一個IEnumerable<string[]>,而不是List<object[]>

Enuemrable.OfType過濾掉任何無效的轉換。您可能需要考慮Enumerable.Cast,如果您犯了錯誤,則會拋出。如果string[]沒有繼承object[](我真的不記得),那麼您可能需要撥打Enumerable.Select來提供轉換。

您肯定需要在那裏的Enumerable.ToList調用。

0

如何做這種方式

List<string[]> sList = new List<string[]> {new []{"A", "B"}}; 
List<object[]> oList = sList.Cast<object[]>().ToList(); 
2

因爲數組協變的,在.NET 4.0中,你可以這樣做:

// Works because: 
// a) In .NET, a string[] is an object[] 
// b) In .NET 4.0, an IEnumerable<Derived> is an IEnumerable<Base>    
var result = parameters.ToList<object[]>(); 

但請注意,你不會是能夠變異那些除了字符串以外的其他數組(因爲數組協變並非真正安全)。

如果你想真正靈活的可寫對象數組,你可以這樣做:

var result = parameters.Select(array => array.ToArray<object>()) 
         .ToList(); 

(或)

var result = parameters.ConvertAll(array => array.ToArray<object>()); 

然後,你可以替換的情況下,每個內部數組的元素幾乎任何請輸入你的名字。

+0

謝謝你。然而,儘管我的原始類型的問題。上面的第一個是我嘗試過的,但沒有'var',爲什麼在這種情況下'var'造成了至關重要的區別 - 我想答案是它爲我執行了'ToList()'強制轉換。真奇怪......感謝你的時間。 ' – MoonKnight

+0

'var'不是必需的,你可以做'List result = parameters.ToList ();',所以我不確定你最初的嘗試出錯的地方。 – Ani

相關問題