2016-01-20 2 views
0

Мне нужно прочитать в массиве имен бейсболистов и различных статистических данных, которые ограничены символом ';'. Здесь находятся две строки таким образом мой пример кода будет иметь смыслЧтение в массиве из текстового файла

Abreu, J;CWS;1B;30;101;0.29 
Altuve, J;HOU;2B;15;66;0.313 

В настоящее время я читаю файл в массив, где каждая строка находится в своем собственном индексе в массиве с помощью следующего кода:

public static void fillArray() 
    { 
     string[] linesInFile = File.ReadAllLines(GlobalVariables.filePath); 
     //EACH LINE IS A STRING AT THIS POINT 
     foreach (string s in linesInFile) 
     { 
      string[] items = s.Split(';'); 
      for (int i = 0; i < items.Length; i++) 
      { 
       Console.WriteLine(items[i]); 
       //Console.WriteLine(items[1]); 
      } 
     } 
    } 

Единственная проблема: я новичок в C# и не знаю, как получить доступ к этому заполненному массиву из другого метода, чтобы я мог сортировать его и отображать различную информацию и т. Д.

Я искал все перестановки, которые я могу думать на google, но я не могу найти подходящих wers.

Спасибо за помощь.

+0

Какова каждая из названных характеристик? – Enigmativity

+0

@ Энигматический игрок, команда, положение, домашние бега, RBI; средний батинг – kalenpw

ответ

1

Просто измените подпись своего метода fillArray, чтобы вернуть array. Учитывая пример кода, вам понадобится двухмерный массив, потому что у вас есть несколько строк, поэтому jagged array будет хорошим выбором, если статистика игроков не будет фиксированной (у некоторых игроков может быть меньше или больше статистики). Альтернативно вместо массива вы можете вернуть список списков (List<List<string>>), которые более гибкие, чем массивы. Так что ваш код возвращает зазубренный массив будет выглядеть следующим образом:

public static string[][] fillArray() 
{ 
    string[] linesInFile = File.ReadAllLines(GlobalVariables.filePath); 
    string[][] result = new string[linesInFile.Length][]; 
    int index = 0; 
    //EACH LINE IS A STRING AT THIS POINT 
    foreach (string s in linesInFile) 
    { 
     string[] items = s.Split(';'); 
     result[index++] = items; 
    } 

    return result; 
} 

Обратите внимание, что более предпочтительно,/читаемым, чтобы вернуть массив вместо того, чтобы иметь глобальный характер, и изменить его в вашем методе.

1

как этот заполненный массив из другого метода

Вы либо должны были бы передать массив в другой метод в качестве параметра или вам нужно будет объявить переменную вне метода его объем.

1

Одним из способов является создание списка этих массивов вне метода fillArray

List<string[]> itemsList = new List<string[]>(); //declare this outside of the method 
public static void fillArray() 
{ 
    string[] linesInFile = File.ReadAllLines(GlobalVariables.filePath); 
    //EACH LINE IS A STRING AT THIS POINT 
    foreach (string s in linesInFile) 
    { 
     string[] items = s.Split(';'); 
     itemsList.Add(items); //add the list in the itemsList 
     for (int i = 0; i < items.Length; i++) 
     { 
      Console.WriteLine(items[i]); 
      //Console.WriteLine(items[1]); 
     } 
    } 
} 

Тогда просто использовать его в другой метод, как это:

public void otherMethod(){ 
    string[] itemsAtZero = itemsList[0]; //your first string[] items 
    string[] itemsAtOne = itemsList[1]; //your second string[] items 
    //and so on... 
} 
0

ли что-то вроде этого ... вы можете найти множество хороших учебных пособий в Интернете, чтобы помочь вам создать фундамент на C#

static void Main() 
{ 
    List<MyObject> myListOfObjects = fillArray(); 
    DisplaySortedArray(myListOfObjects); 
    Console.ReadLine(); 
} 

public static void DisplaySortedArray(List<MyObject> myListOfObjects) 
{ 
    foreach(var myObject in myListOfObjects) 
    { 
     Console.WriteLine(myObject.Property1); 
     Console.WriteLine(myObject.Property2); 
     Console.WriteLine(myObject.Property3); 
     Console.WriteLine(myObject.Property4); 
     Console.WriteLine(myObject.Property5); 
     Console.WriteLine(myObject.Property6); 
    } 
} 

public static List<MyObject> fillArray() 
{ 
    string[] linesInFile = File.ReadAllLines(GlobalVariables.filePath); 
    List<MyObject> myListOfObjects = new List<MyObject>(); 

    foreach (string s in linesInFile) 
    { 
     string[] items = s.Split(';'); 
     MyObject myObject = new MyObject(); 
     myObject.Property1 = items[0]; 
     myObject.Property2 = items[1]; 
     myObject.Property3 = items[2]; 
     myObject.Property4 = items[3]; 
     myObject.Property5 = items[4]; 
     myObject.Property6 = items[5]; 
     myListOfObjects.Add(myObject); 
    } 

    return myListOfObjects; 
} 

public class MyObject 
{ 
    public string Property1 {get;set;} 
    public string Property2 {get;set;} 
    public string Property3 {get;set;} 
    public string Property4 {get;set;} 
    public string Property5 {get;set;} 
    public string Property6 {get;set;} 
} 
1

я бы об этом так:

Player[] players = 
(
    from line in File.ReadAllLines(GlobalVariables.filePath) 
    let parts = line.Split(';') 
    select new Player(
     parts[0], parts[1], parts[2], 
     int.Parse(parts[3]), int.Parse(parts[4]), 
     double.Parse(parts[5])) 
).ToArray(); 

Вы получите этот результат:

players

Вы будете нуждаться в этом Player класс тоже:

public sealed class Player : IEquatable<Player> 
{ 
    private readonly string _Name; 
    private readonly string _Team; 
    private readonly string _Position; 
    private readonly int _HomeRuns; 
    private readonly int _Rbi; 
    private readonly double _BattingAverage; 

    public string Name { get { return _Name; } } 
    public string Team { get { return _Team; } } 
    public string Position { get { return _Position; } } 
    public int HomeRuns { get { return _HomeRuns; } } 
    public int Rbi { get { return _Rbi; } } 
    public double BattingAverage { get { return _BattingAverage; } } 

    public Player(string Name, string Team, string Position, int HomeRuns, int Rbi, double BattingAverage) 
    { 
     _Name = Name; 
     _Team = Team; 
     _Position = Position; 
     _HomeRuns = HomeRuns; 
     _Rbi = Rbi; 
     _BattingAverage = BattingAverage; 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj is Player) 
      return Equals((Player)obj); 
     return false; 
    } 

    public bool Equals(Player obj) 
    { 
     if (obj == null) return false; 
     if (!EqualityComparer<string>.Default.Equals(_Name, obj._Name)) return false; 
     if (!EqualityComparer<string>.Default.Equals(_Team, obj._Team)) return false; 
     if (!EqualityComparer<string>.Default.Equals(_Position, obj._Position)) return false; 
     if (!EqualityComparer<int>.Default.Equals(_HomeRuns, obj._HomeRuns)) return false; 
     if (!EqualityComparer<int>.Default.Equals(_Rbi, obj._Rbi)) return false; 
     if (!EqualityComparer<double>.Default.Equals(_BattingAverage, obj._BattingAverage)) return false; 
     return true; 
    } 

    public override int GetHashCode() 
    { 
     int hash = 0; 
     hash ^= EqualityComparer<string>.Default.GetHashCode(_Name); 
     hash ^= EqualityComparer<string>.Default.GetHashCode(_Team); 
     hash ^= EqualityComparer<string>.Default.GetHashCode(_Position); 
     hash ^= EqualityComparer<int>.Default.GetHashCode(_HomeRuns); 
     hash ^= EqualityComparer<int>.Default.GetHashCode(_Rbi); 
     hash ^= EqualityComparer<double>.Default.GetHashCode(_BattingAverage); 
     return hash; 
    } 

    public override string ToString() 
    { 
     return String.Format("{{ Name = {0}, Team = {1}, Position = {2}, HomeRuns = {3}, Rbi = {4}, BattingAverage = {5} }}", _Name, _Team, _Position, _HomeRuns, _Rbi, _BattingAverage); 
    } 
} 
1

У вас должно быть возвращение массив следующим образом:

public static String[][] fillArray() { 
    return File 
     .ReadLines(GlobalVariables.filePath) 
     .Select(line => line.Split(';')) 
     .ToArray(); // usually not necessary, but question requies array 
    } 

И вы можете, скажем, напечатать массив образуют некоторый другой метод:

Console.Write(String.Join(Ebvironment.NewLine, fillArray() 
    .OrderBy(items => items[1]) // Let's sort the array by second column 
    .ThenBy(items => items[0]) // ..and by 1st column on tie 
    .Select(items => String.Join(",")))); 

Лучший подход должен вернуть специальный разработанный класс Player вместо String[] как это:

public static Player[] fillArray() { 
    return File 
     .ReadLines(GlobalVariables.filePath) 
     .Select(line => line.Split(';')) 
     .Select(items => new Player(items[0], items[1], items[2]) { 
     HomeRuns = Int.Parse(items[3], CultureInfo.InvariantCulture), 
     RBI = Double.Parse(items[4], CultureInfo.InvariantCulture), 
     Batting = Double.Parse(items[5], CultureInfo.InvariantCulture), 
     }) 
     .ToArray(); // usually not necessary, but question requies array 
    } 

и образец отчета будет

Console.Write(String.Join(Ebvironment.NewLine, fillArray() 
    .OrderBy(player => player.Team) 
    .ThenBy(player => player.Name));