2011-09-20 62 views
0

這裏是我的情況下,爲什麼params不接受泛型?

函數:

public String StringConcat(params String[] parameter) 
    { 
     String l_strReturnValue = String.Empty; 
     for (Int32 l_nIndex = 0; l_nIndex < parameter.Length; l_nIndex++) 
     { 
      l_strReturnValue += parameter[l_nIndex]; 
     } 
     return l_strReturnValue; 
    } 

而且我稱它像

 List<String> l_lstTest = new List<string> { "A", "B", "C" }; 
     String l_strString = StringConcat(l_lstTest.Select(X => X).ToArray()); 

它返回的值是 「ABC」

但其表現錯誤如果我打電話功能沒有類型convrsion像

 String l_strString = StringConcat(l_lstTest.Select(X => X)); 

那麼如何在不轉換的情況下使用該功能呢?

注1:

在的XDocument Add方法 - 他們已經使用像params,但有類型轉換的沒有這樣的需要。

注2:

這篇文章的目的是不添加字符串,只是想了解更多關於params的限制。

回答

4

返回類型Select(X => X)將是IEnumerable<string> - 不是數組。所以你需要另一個過載:

public String StringConcat(IEnumerable<string> parameter) 

你可能會讓數組重載調用這個過載。

(是的,很顯然你想使用StringBuilder,而不是重複字符串連接 - 和foreach代替for循環)。對相關XDocument.Add重載採用params Object[]參數

注意,不是params String[] - 和LINQ to XML的工作原理是,如果您嘗試添加本身可枚舉的東西,就好像您依次添加了每個項目。這不是語言的一部分 - 它是實現的一部分。所以,如果你撥打:

doc.Add(someStringArray.Select(x => x)) 

將實際只需調用XDocument.Add(object)這將通知該參數實施IEnumerable

+0

謝謝....你可以請帖,爲什麼你建議'Foreach'而不是'for'loop。 'Foreach'是對象類型....因此與索引類型('for')循環相比,它會花更多時間? –

+1

@Pramodh:'foreach'是一個更高層次的抽象 - 代碼更加清晰,並且表達了你想要更緊密地實現的內容。實際上,數組中的foreach循環無論如何都會使用數組索引器 - 但是,除非您發現存在問題,否則通常不應該關心該細節級別的性能。由於使用了字符串連接,你的代碼的性能很糟糕*對於大型數組,因爲使用了字符串連接,所以'foreach'和'for'之間的任何區別都是* nothing *與低效率相比。 –

4

關鍵字params的限制是參數必須是數組類型。

l_lstTest.Select(X => X)IEnumerable<string>,而不是一個數組,因此它與形式參數類型不匹配。如果您嘗試傳遞一個普通的int,它不起作用的原因不同。

要使其工作,你應該添加方法的另一個重載:

public String StringConcat(IEnumerable<string> parameter) 
{ 
    // your code here 
} 
1

它的設計則params的限制,因爲如果你使用

public String StringConcat(params object[] parameter) 

和你的IEnumerable叫,你無法弄清楚參數是單個參數,還是應該迭代枚舉。舉例來說,如果沒有這個限制,在

StringConcat(l_lstTest.Select(X => X)) 

了IEnumerable應的參數列表中的一個元素,或者它的參數列表?

相關問題