2012-03-14 18 views
2

これは別の投稿のフォローアップの質問ですが、その投稿には回答がありました。 3つの項目をジェネリッククラスに追加するためのforループがあり、それをどうやって行うのか分かりません。これらのアイテムを追加するにはどうすればいいですか?C#一般的なリストに追加する際の問題

private static void TestResults() 
{ 
    List<Record> Records = new List<Record>(); 

    for (int i = 0; i < ProxyList.Count; i++) 
    { 
     string[] split = List[i].Split('|'); 
     // This is what i dont know how to do 
     // split[0] = Name, split[1] = SomeValue and split[3] = OrderNr 
    } 
} 

class Records 
{ 
    public static string Name { get; set; } 
    public static int SomeValue { get; set; } 
    public static int OrderNr { get; set; } 
} 

答えて

2

まあtry/catch文でRecordsの作成をラップすることをお勧めします(不正な入力を考える)、あなたの特性は静的ではないなければなりません。それぞれのインスタンスごとに異なるデータが必要なのでしょうか?したがって、インスタンスのプロパティが必要です。個人的に私はまたタイプが不変作ると思いますが、それはまた別の問題だ:

class Record // Changed from Records; each object is only a single record... 
{ 
    public string Name { get; set; } 
    public int SomeValue { get; set; } 
    public int OrderNumber { get; set; } 
} 

private static List<Record> ConvertRecords(IEnumerable<string> lines) 
{ 
    List<Record> records = new List<Record>(); 

    foreach (string line in lines) 
    { 
     string[] split = line.Split('|'); 
     Record record = new Record { 
      Name = split[0], 
      SomeValue = int.Parse(split[1]), 
      OrderNumber = int.Parse(split[2]); 
     }; 
     records.Add(record); 
    } 
} 

C#3/.NET 3.5の時点では、より多くの慣用的なアプローチは、LINQを使用することです:

private static List<Record> ConvertRecords(IEnumerable<string> lines) 
{ 
    return (from line in lines 
      let split = line.Split('|') 
      select new Record { 
       Name = split[0], 
       SomeValue = int.Parse(split[1]), 
       OrderNumber = int.Parse(split[2]); 
      }).ToList(); 
    } 
} 

を..あなたが本当に言語を学び始めているのであれば、それは比較的進んでいます。

正直に言うと、スタックオーバーフローが構造化された学習よりも具体的な質問尋ねるために優れている - 私は、このようなC# 4 in a Nutshellとして、あなたは良い本を手に入れるお勧めします。

4

最初のステップは、型自体対Recordsのインスタンスのフィールドを関連付けることです。これは、実際にインスタンスを作成するにはstatic修飾子を

class Records 
{ 
    public string Name { get; set; } 
    public int SomeValue { get; set; } 
    public int OrderNr { get; set; } 
} 

を取り除くことによって行われ、次の

for (int i = 0; i < ProxyList.Count; i++) { 
    string[] split = List[i].Split('|'); 
    Records record = new Records() { 
    Name = split[0] 
    SomeValue = Int32.Parse(split[1]) 
    OrderNr = Int32.Parse(split[2]) 
    }; 
    Records.add(record); 
} 

を試してみてください。この特定の例では、オブジェクトを作成するための行為を結合するオブジェクト初期化子を使用し、そのフィールドを設定。オリジナルstringの項目番号がなかった場合Int32.Parseメソッドは例外をスローし

for (int i = 0; i < ProxyList.Count; i++) { 
    string[] split = List[i].Split('|'); 
    Records record = new Records(); 
    record.Name = split[0]; 
    record.SomeValue = Int32.Parse(split[1]); 
    record.OrderNr = Int32.Parse(split[2]); 
    Records.add(record); 
} 

これは以下のように長い形状に拡張することができます。これは可能性があるなら、あなたは、一つには

+0

私も、静的からわずか公共にレコード内のフィールドを変更するために追加し、このクラスのインスタンス化することが必要となりますので、{取得;セット}。 – Jetti

+0

@ジェッティはちょうどそれを行う編集を提出しました。ありがとう! – JaredPar

1

静的な理由はわかりません。しかし、この方法を試してください。

private static void TestResults() 
    { 
List<Record> Records = new List<Record>(); 

for (int i = 0; i < ProxyList.Count; i++) 
     {; 
      string[] split = List[i].Split('|'); 
      Records.Add(new Record() {Name = Namesplit[0] , SomeValue = split[1], OrderNr = split[3]}) ; 

     } 
} 
関連する問題