2011-09-20 15 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; 
    } 

と私はそれが "ABC"

しかし、その上映として値を返します

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

のようにそれを呼んでいますエラーが発生しました。タイプなしの関数を呼び出すとエラーが発生します

 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代わりの繰り返し文字列の連結を使用したいと思います - 。forループの代わりにとforeachを)

注意関連XDocument.Add過負荷がparams Object[]パラメータを取ることなく、params String[] - とLINQ to XMLは、それ自体が列挙可能なものを追加しようとすると、順番に各アイテムを追加したように動作します。これは言語の一部ではなく、実装の一部です。あなたが呼ぶのであれば:

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

それは実際にはどの引数がIEnumerableを実装すること予告意志XDocument.Add(object)を呼び出します。

+0

ありがとうございます。あなたは 'for'loopの代わりに' Foreach'を提案した理由を投稿してください。 'Foreach'はオブジェクト型です....インデックス型(' for')ループに比べて時間がかかります??? –

+1

@Pramodh: 'foreach'はより高いレベルの抽象化です。コードはより洗練されており、より綿密に達成しようとしていることを表現しています。実際には、配列上の 'foreach'ループは配列インデクサーを使用しますが、問題が見つかるまでその詳細レベルでのパフォーマンスについても気にするべきではありません。文字列連結を使用するため、大規模配列の場合、コードのパフォーマンスは*恐ろしい*です。foreachとforの違いは、その非効率性に比べて何もありません。 –

4

paramsキーワードの制限は、パラメータが配列型でなければならないということです。

l_lstTest.Select(X => X)IEnumerable<string>であり、配列ではないため、仮パラメータタイプと一致しません。平文を渡そうとすると動作しないのと同じ理由で動作しませんint。あなたは

public String StringConcat(params object[] parameter) 

を使用しているかのため

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

それはデザインによってのparamsの制限が、だとあなたは、IEnumerableを使って呼び出さ:

は、メソッドの別のオーバーロードを追加する必要があり、それを動作させるために、そのパラメータが単一のパラメータであるかどうか、またはそのパラメータを繰り返し処理する必要があるかどうかを判断できませんでした。たとえば、この制限がない場合、

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

IEnumerableはパラメータのリストの要素である必要があります。

関連する問題