-3

辞書がどのように機能するかを確認するためだけに、単純な mp3 プレーヤーを作成しています。私のプロジェクトには6つのクラスがあり、そのうち2つは無関係です。最初のクラスにはタグが含まれ、2 番目は検索、3 番目は再生、4 番目の抽象クラスには辞書が含まれます。search クラスと play クラスはどちらも 4 番目のクラスを継承しています。

検索に行くと、オブジェクトがディクショナリDictionary dict<string, Tags>に正常に追加され、タグが Tags クラスから追加されます。私の問題は、 Play クラスからアクセスして辞書からパスを取得しようとすると、キーが存在しないと表示されることです。コードは ですdict[playSongName].Path;。ここで、playSongName は辞書に保存されている曲の名前です。

class Player : Liste
{
        public void Play(string playSongName)
        {
            currentSongPath = dictPesmi[playSongName].Path; // Error here, key was not found
            currentSongName = playSongName;
            media.Source = new Uri(currentSongPath);
            media.Play();
        }
}

abstract class Liste
{
    public Dictionary<string, Tagi> dictPesmi = new Dictionary<string, Tagi>();
    public Id3TagClass id3tagi = new Id3TagClass();
}

class Search : Liste
{

    string[] filesFound;
    const string extension = "*.mp3";


    public void Find(string searchPath)
    {
        if (Directory.Exists(searchPath))
        {
            filesFound = Directory.GetFiles(searchPath, extension, SearchOption.AllDirectories);
            foreach (string filePath in filesFound)
            {
                string[] filePathSplit = filePath.Split('\\');
                string fileName = filePathSplit[filePathSplit.Length - 1];

                dictPesmi[fileName] = new Tagi() { Path = filePath, Name = fileName };
                dictPesmi[fileName].Author = id3tagi.GetArtist(filePath);
                dictPesmi[fileName].Album = id3tagi.GetAlbum(filePath);
                dictPesmi[fileName].Title = id3tagi.GetTitle(filePath);
                System.Windows.MessageBox.Show(dictPesmi[fileName].Path);
            }


        }

    }
}

class Tagi
{

    string path;
    string name;
    string title;
    string author;
    string album;

    public string Album
    {
        get { return album; }
        set { album = value; }
    }

    public string Author
    {
        get { return author; }
        set { author = value; }
    }

    public string Title
    {
        get { return title; }
        set { title = value; }
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public string Path
    {
        get { return path; }
        set { path = value; }
    }

}

メインクラス

public partial class MainWindow : Window
{

    Player player = new Player();
    Search search = new Search();

   // string selectedSong;

    public MainWindow()
    {
        InitializeComponent();
    }

    public void KeyDownEvent_(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.F1)
            player.Play(lbPlaylist.Items[lbPlaylist.Items.IndexOf(lbPlaylist.SelectedItem)].ToString());// passed string
        if (e.Key == Key.F3)
            search.Find(tbSearch.Text);
        if (e.Key == Key.F5)
        {
            foreach (Tagi d in search.dictPesmi.Values)
            {
                if (!lbPlaylist.Items.Contains(d.Name))
                    lbPlaylist.Items.Add(d.Name);
            }
        }
        if (e.Key == Key.F9)
        {

        }
    }

F1を押すと、説明されているエラーが表示されます

4

1 に答える 1

0

ここでの問題は、Search のインスタンスに含まれる Dictionary を入力しているという事実ですが、Player のインスタンスに含まれるデータを探しているため、まだ空です。

Liste から派生したクラスのインスタンスを作成するたびに、新しい空の Dictionary が作成されます。次のようにコードを変更するとうまくいきますが、これは実際にはオブジェクト指向ではありません。私はそれを本当に「醜い」と考えており、代わりにアプリケーションの設計を変更します。

public void KeyDownEvent_(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F1)
        player.Play(lbPlaylist.Items[lbPlaylist.Items.IndexOf(lbPlaylist.SelectedItem)].ToString());// passed string
    if (e.Key == Key.F3)
        search.Find(tbSearch.Text);
    if (e.Key == Key.F5)
    {
        foreach (Tagi d in search.dictPesmi.Values)
        {
            if (!lbPlaylist.Items.Contains(d.Name))
                lbPlaylist.Items.Add(d.Name);
        }
        // add this line to use the data just collected:
        player.dictPesmi = search.dictPesmi;
    }
    if (e.Key == Key.F9)
    {

    }
}
于 2013-01-22T15:16:33.763 に答える