Массивы являются действительно только уместно, если вы знаете, сколько вам нужно раньше времени, и если вы не будете вставлять или удалять элементы. Даже тогда объект коллекции, такой как Список, часто предпочтительнее.
Вы могли бы сделать что-то вроде этого:
// 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
});
}
}
}
Если вы должны быть в состоянии найти значения для конкретного имени, существует два подхода. Один из них - это циклическое сопоставление с именем Name и сохранение индекса List. Более идиоматических способ сделать это (хотя это не так просто для новой пришелец читать) является:
String nameToFind = "...";
String stop = items.Where(item => item.Name == nameToFind).FirstOrDefault().Stop;
Обратите внимание, что FirstOrDefault
вернется null
, если такой элемент не найден, в этом случае .Stop
разыменования будет бросить исключение.
С другой стороны, если вы действительно хотите, чтобы вся эта структура данных была проиндексирована по имени, 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;
Я думаю, вы говорите о «неровными» массивов: вот ссылка, которая объясняет использование: http://msdn.microsoft.com/en-us/library/2s05feca.aspx –
Привет! Я потратил время на форматирование кода, но в будущем вы должны сделать свой код презентабельным, прежде чем публиковать свой вопрос. (Чтобы опубликовать много кода за один раз, используйте выбор «Образец кода», чтобы отложить все это на четыре пробела, что делает его форматированием как код) – Patashu