[英]Comparing and combining arrays of strings from text files
马上,我不认为问题的措词是正确的,我只是真的不知道该写些什么。
话虽如此,我有3个txt文件正在加载到该程序中,它们分别是Dudes,Tunes和Bands。 Dudes的格式如下:| Tunes的格式; songName | composer | band | coverArtists1 | coverArtists2 | etc。 像这样的乐队 bandName | bandType | member1 | member2 |等。 “ |” 是我分割数据的地方,因此文本文件的每一行都变成字符串数组。
我现在要尝试的是,当用户输入乐队的名称时,它将返回乐队的名称,其类型以及每个乐队成员及其演奏乐器的列表。 该过程取决于输入什么类型的频带。 例如,RockBand类型需要吉他手,鼓手,贝斯手和歌手。 乐队的每种类型都是其自己的类,它是乐队的子类。
class Program
{
static Tunes t1 = new Tunes();
static Dudes d1 = new Dudes();
static Bands b1 = new Bands();
static void Main(string[] args)
{
do
{
Console.WriteLine();
} while (DoAQuery() != "0");
}
static string DoAQuery()
{
string prompts = "0: Quit \n" +
"1: Who wrote <song name> \n" +
"2: What does <musician name> play \n" +
"3: What songs were written by <composer> \n" +
"4: Who plays in the <band name> \n" +
"5: Who's recorded <song name> \n" +
"6: What songs has the <band name> recorded \n" +
"7: Has the <band name> recorded <song name> \n";
Console.WriteLine(prompts);
Console.Write("Enter a command number: ");
string cmd = Console.ReadLine();
switch (cmd)
{
case "0" :
return cmd;
case "1" :
Case1();
return cmd;
case "2" :
Case2();
return cmd;
case "3":
Case3();
return cmd;
case "4":
Case4();
return cmd;
case "5":
Case5();
return cmd;
case "6":
Case6();
return cmd;
case "7":
Case7();
return cmd;
default:
Console.WriteLine("!!Command must be a number 0-7!!");
return "1";
}
}
static void Case1()
{
Console.Write("Enter a song name: ");
string songName = Console.ReadLine();
t1.Case1(songName);
}
static void Case2()
{
Console.Write("Enter a musician's name: ");
string musName = Console.ReadLine();
d1.Case2(musName);
}
static void Case3()
{
Console.Write("Enter a composers name: ");
string compName = Console.ReadLine();
t1.Case3(compName);
}
static void Case4()
{
Console.Write("Enter a band name: ");
string bandName = Console.ReadLine();
b1.Case4(bandName);
}
乐队班
class Band
{
protected Tunes t1 = new Tunes();
protected Dudes d1 = new Dudes();
protected string name;
protected string type;
protected List<Tune> recordings = new List<Tune>();
public string Name
{
get { return name; }
}
public List<Tune> Recordings
{
get { return recordings; }
}
public string Type
{
get { return type; }
}
public Band(string[] lineAra)
{
name = lineAra[0];
type = lineAra[1];
//recordings = t1.for4(name);
}
}
乐队班
class Bands
{
private List<Band> bands = new List<Band>();
private Dictionary<string, Band> bandsByName = new Dictionary<string, Band>();
public Bands()
{
string fileName = @"C:\Users\Lkvideorang\Documents\Visual Studio 2013\Projects\KernRadio\KernRadio\bin\Debug\bands.txt";
try
{
using (StreamReader myRdr = new StreamReader(fileName))
{
string line;
while ((line = myRdr.ReadLine()) != null)
{
string[] lineAra = line.Split('|');
switch(lineAra[1])
{
case "RockBand":
{
RockBand newBand = new RockBand(lineAra);
bands.Add(newBand);
bandsByName.Add(newBand.Name, newBand);
break;
}
case "JazzCombo":
{
JazzCombo newBand = new JazzCombo(lineAra);
bands.Add(newBand);
bandsByName.Add(newBand.Name, newBand);
break;
}
case "SoloAct":
{
SoloAct newBand = new SoloAct(lineAra);
bands.Add(newBand);
bandsByName.Add(newBand.Name, newBand);
break;
}
default :
{
Band newBand = new Band(lineAra);
bands.Add(newBand);
bandsByName.Add(newBand.Name, newBand);
break;
}
}
//Band newBand = new Band(lineAra);
//bands.Add(newBand);
//bandsByName.Add(newBand.Name, newBand);
}
}
Console.WriteLine("loaded " + bands.Count + " bands");
}
catch
{
Console.WriteLine("Error reading file! Read " + bands.Count + " tunes.");
}
}
public void Case4(string bandName)
{
if (bandsByName.ContainsKey(bandName))
{
Console.WriteLine(bandsByName[bandName].Name + " is a " + bandsByName[bandName].Type);
Console.WriteLine();
}
else
{
Console.WriteLine("No band with that name found.");
}
}
}
RockBand(Band的子类)
class RockBand : Band
{
private Musician vocalist;
private Musician bass;
private Musician drums;
private Musician guitar;
public RockBand (string[] lineAra) : base (lineAra)
{
//I would assign values to four members here
}
}
音乐家班
class Musician
{
string name;
string instrument;
public string Name
{
get { return name; }
set { name = value; }
}
public string Instrument
{
get { return instrument; }
set { instrument = value; }
}
public Musician(string [] lineAra)
{
name = lineAra[0];
instrument = lineAra[1];
}
}
杜德班
class Dudes
{
static List<Musician> dudes = new List<Musician>();
Dictionary<string, Musician> dudesByName = new Dictionary<string, Musician>();
public Dudes()
{
string fileName = @"C:\Users\Lkvideorang\Documents\Visual Studio 2013\Projects\KernRadio\KernRadio\bin\Debug\dudes.txt";
try
{
using (StreamReader myRdr = new StreamReader(fileName))
{
string line;
while ((line = myRdr.ReadLine()) != null)
{
string[] lineAra = line.Split('|');
Musician newDude = new Musician(lineAra);
dudes.Add(newDude);
dudesByName.Add(newDude.Name, newDude);
}
}
Console.WriteLine("loaded " + dudes.Count + " dudes");
}
catch
{
Console.WriteLine("Error reading file! Read " + dudes.Count + " tunes.");
}
}
public void Case2(string musName)
{
if (dudesByName.ContainsKey(musName))
{
Console.WriteLine(musName + " plays " + dudesByName[musName].Instrument);
}
else
{
Console.WriteLine("No musician with that name found.");
}
}
}
我知道这是很多代码,我很确定这是一个简单的问题,但是老实说,我很困惑,不知道从哪里开始。 预先谢谢您,我很乐意提供任何澄清。
为什么要每次都加载文件,而不是将信息存储在简单的数据库中,是有原因的? 如果将数据存储在简单的数据库中,则可以以较低的开销快速轻松地返回信息。
您甚至可以使用诸如实体框架之类的东西,该实体框架将提供与数据表匹配的对象。
首先,尝试为变量和方法赋予有意义的名称。 像tunesRepository
而不是t1
一样,或者像GetMusician
而不是Case2
。
似乎您在理解如何管理数据之间的关系时遇到了麻烦。 例如,如果乐队在单独的文件中,乐队如何引用音乐家。 一个简单的解决方案是为Bands
类提供对Musician
类的引用。 然后,您可以在创建乐队对象时按名称查找音乐家:
public BandDatabase(MusicianDatabase musicianDatabase)
{
this.musicianDatabase = musicianDatabase;
string fileName = @"C:\Code\Sandbox\ConsoleApplication1\input.txt";
string[] allLines;
try
{
allLines = File.ReadAllLines(fileName);
}
catch (Exception ex)
{
Console.WriteLine("Error reading file! Exception: " + ex.Message);
return;
}
bands = new List<Band>();
foreach (var line in allLines)
{
try
{
string[] lineAra = line.Split('|');
if (lineAra.Length < 2) continue;
switch (lineAra[1])
{
case "RockBand":
bands.Add(CreateRockBand(lineAra));
break;
// Rest of cases
}
}
catch (Exception ex)
{
Console.WriteLine("Error parsing line {0}. Exception: {1}", line, ex.Message);
}
}
bandsByName = bands.ToList().ToDictionary(x => x.Name, x => x);
Console.WriteLine("loaded " + bands.Count + " bands");
}
private RockBand CreateRockBand(string[] lineAra)
{
Musician vocalist = null;
Musician bass = null;
Musician drums = null;
Musician guitar = null;
if (lineAra.Length >= 3)
vocalist = musicianDatabase.GetMusicianByName(lineAra[2]);
if (lineAra.Length >= 4)
bass = musicianDatabase.GetMusicianByName(lineAra[3]);
if (lineAra.Length >= 5)
drums = musicianDatabase.GetMusicianByName(lineAra[4]);
if (lineAra.Length >= 6)
guitar = musicianDatabase.GetMusicianByName(lineAra[5]);
return new RockBand(lineAra, vocalist, bass, drums, guitar);
}
您需要稍微更新Band
类,以使上面的构造函数起作用:
public class RockBand : Band
{
public RockBand(string[] lineAra, Musician vocalist, Musician bass, Musician drums, Musician guitar)
: base(lineAra)
{
Vocalist = vocalist;
BassPlayer = bass;
Drummer = drums;
GuitarPlayer = guitar;
}
public Musician Vocalist { get; set; }
private Musician BassPlayer { get; set; }
private Musician Drummer { get; set; }
private Musician GuitarPlayer { get; set; }
}
然后,您将需要在Main
方法中进行初始化,如下所示:
private static MusicianDatabase musicianDatabase;
private static BandDatabase bandDatabase;
static void Main(string[] args)
{
musicianDatabase = new MusicianDatabase();
bandDatabase = new BandDatabase(musicianDatabase);
}
然后您可以根据要求打印详细信息:
static void PrintBandDetails()
{
Console.Write("Enter a band name: ");
string bandName = Console.ReadLine();
var band = bandDatabase.GetBand(bandName);
if (band == null)
{
Console.WriteLine("Invalid band name")
return;
}
Console.WriteLine("Guitarist was " + band.GuitarPlayer);
// etc.
var tunes = tuneDatabase.GetByBand(bandName);
Console.WriteLine("Tunes:");
foreach(var t in tunes)
Console.WriteLine(t);
}
我希望这更有意义。 我试图用您应该理解的术语来构建所有内容。 但是,如果仍有部分令人困惑,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.