配列は、事前に必要な数がわかっている場合、および要素を挿入または削除しない場合にのみ適切です。それでも、多くの場合、List のようなコレクション オブジェクトが好まれます。
次のようなことができます。
// Convention in C# is to use properties instead of fields for something like this
// also, having the class name in the field name is redundant
public class Instance
{
public string Name {get;set;}
public string Stop {get;set;}
public string Restart {get;set;}
public string Backup {get;set;}
}
public static void Main(string[] args)
{
List<Instance> items = new List<Instance>();
// the using block will close the file handle
using (System.IO.StreamReader file = new System.IO.StreamReader(@"C......"))
{
while(true)
{
String name = file.ReadLine(), stop = file.ReadLine(), restart = file.ReadLine(), backup = file.ReadLine();
if (name == null || stop == null || restart == null || backup == null)
break; // I didn't test it, but this should work for determining the end of the file
items.Add(new Instance(){
Name = name,
Stop = stop,
Restart = restart,
Backup = backup
});
}
}
}
特定の名前の値を見つける必要がある場合は、2 つの方法があります。1 つは、Name プロパティと比較してループし、List インデックスを格納することです。これを行うためのより慣用的な方法は次のとおりです (ただし、初心者にとっては簡単ではありません)。
String nameToFind = "...";
String stop = items.Where(item => item.Name == nameToFind).FirstOrDefault().Stop;
そのような要素が見つからない場合FirstOrDefault
は返されることに注意してください。その場合、逆参照は例外をスローします。null
.Stop
一方、このデータ構造全体に名前でインデックスを付けたい場合は、a List
(または配列) が最善の方法ではない可能性があります。別の解決策は次のとおりです。
public class Instance2
{
public string Stop {get;set;}
public string Restart {get;set;}
public string Backup {get;set;}
}
Dictionary<String, Instance2> items = new Dictionary<String, Instance2>();
// ...
items[name] = new Instance2(){Stop = stop,
Restart = restart,
Backup = backup};
このようなデータ構造を使用すると、名前で検索する方がはるかに効率的です (O(log(n))
と比較してO(n)
)。あなたはただするでしょう:
String nameToFind = "...";
String stop = items[nameToFind].Stop;