2016-01-20 252 views
0

我需要閱讀一組棒球運動員名稱和各種以';'分隔的統計數據。 這裏有2條線,所以我的示例代碼纔有意義從文本文件中讀取數組

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#新手,不知道如何從不同的方法訪問這個填充數組,因此我可以對它進行排序並顯示各種信息等。

我已經搜索了所有我能想到的排列在谷歌上,但我找不到任何相關的答案WERS。

感謝您的幫助。

+0

調用的每個統計數據是什麼? – Enigmativity

+0

@Enigmativity球員;隊;位置;本壘打;打點;擊球平均 – 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));