2016-07-26 17 views
1

私はリストのリストを持っています。 これらのリストのそれぞれでいくつかのOpertationsを実行するには、リストでプロパティを区切り、その値で一時リストを設定します。 リストが空であることがあります。 私はこの機能を割り当てに使用しています。c#別のリスト/新しいリストでリストを初期化する

編集: 私の現在の解決方法はこの簡単な方法です。 これは簡単に適応できるはずです。

private List<string> setList(List<string> a, int count) 
    { 
     List <string> retr; 
     if(a.Capacity == 0) 
     { 
      retr = new List<string>(); 
      for(int counter = 0; counter < count; counter++) 
      { 
       retr.Add(string.empty); 
      } 
     } 
     else 
     { 
      retr = a; 
     } 
     return retr; 
    } 

リストを値として取るか、要素数のリストを初期化する方が良いでしょうか? この動作を持つ独自の "List"クラスを実装する必要がありますか?

var list = Enumerable.Repeat<string>("", count).ToList(); 

しかし、あなたのコードに問題があるいくつかの事柄があります:あなたはループを避けるために望んでいた場合は、Enumerable.Repeat<T>を使用することができ

+4

'List.Capacity'は' List.Count'と同じではなく、リストをクリアするとトリミングされません。この方法のポイントは何ですか?前のリストも空の場合、新しいリストをインスタンス化しないのはなぜですか?また、あなたのコードには "リストのリスト"もありません。 – Groo

+0

私は容量がカウントと同じではないことを知っています。初期化では、サブリストにいくつの要素が含まれているか気にしませんが、どれくらいの数が存在するかはわかりません。 – gismo

+0

最初に実行する必要性を排除する以外に、これは非常に直感的ではないことを客観的に行う良い方法はありません。それでも、「良い方法がある」ということは、コードレビューのために働くコードの種類がより重要であるということです。 –

答えて

2

0ない

  1. Capacity場合には、それはdoesnのそれはあなたの望むものと同じであることを意味しませんcount。たとえそれが指定されたcountと同じであっても、それは実際のList.Countcountに等しいことを意味しません。安全な方法は何をするだろう:List<T>を事前割当て

    static List<string> PreallocateList(List<string> a, int count) 
    { 
        // reuse the existing list? 
        if (a.Count >= count) 
         return a; 
    
        return Enumerable.Repeat("", count).ToList(); 
    } 
    
  2. は珍しいです。あらかじめ固定長がわかっている場合は、通常は配列を使用するのが一般的です。

    // this would (perhaps) make more sense 
    var array = new string[count]; 
    
  3. と1で述べたように、心に留めておく、そのリストのCapacityCountと同じではありません。

    var list = new List<string>(10); 
    
    // this will print 10 
    Console.WriteLine("Capacity is {0}", list.Capacity); 
    
    // but this will throw an exception   
    list[0] = ""; 
    

ほとんどの場合、しかし、この方法が不要とされあなたがやっていることを達成する良い方法です。何もないならば、私は(あなたが事前に割り当てられたリストに依存するアルゴリズムを持っていると仮定)安全なカードをプレイし、単に新しいリストを毎回インスタンス化します:

static List<string> PreallocateList(int count) 
{ 
    return Enumerable.Repeat("", count).ToList(); 
} 

それとも、あなただけ持つことに関心がある場合右容量(カウントされない)、そしてちょうど適切なコンストラクタを使用します。

static List<string> PreallocateList(int count) 
{ 
    // this will prevent internal array resizing, if that's your concern 
    return new List<string>(count); 
} 
+0

ありがとう、私は配列がこの仕事のために良いことを知っています。 私はC#とその組み込みデータモデルを使いこなそうとしています。 – gismo

0

あなたの方法は無意味しかし

static List<string> setList(List<string> a, int count) => 
    a.Capacity == 0 ? Enumerable.Repeat("", count).ToList() : a; 
に相当します

Linqが必要な場合。

関連する問題