从自定义类列表访问值

时间:2019-06-16 07:36:07

标签: c# android xamarin xamarin.android

我有一个歌词应用程序,用户可以在Genius.com上搜索歌曲,并可以查看和下载这些歌词。它们存储在设备上的文件夹中,每个文件都是.txt,名称是歌曲的歌手,名称之间用字符串分隔。

我想要一个保存的歌曲列表,这些歌曲使用ExpandableListView对艺术家进行分组。因此,我阅读了文件的保存目录,并将它们添加到列表中,然后将艺术家和歌曲名称分开,这是一个问题。我需要做的是创建一个自定义类Artist的列表,该列表包含一个name字符串和一个List<string> songs,这样我就可以让一个艺术家将多首歌曲附加到他身上。但是我不知道如何在artistList上按他们的名字找到歌手,并在他们的歌曲列表中添加一些内容。

这是我的代码:

string[] filesList = Directory.GetFiles(path);
List<Artist> artistList = new List<Extensions.Artist>();

foreach (string s in filesList)
{
    string newS = s.Replace(path, "");
    string[] splitted = s.Split(@"!@=-@!"); //this is the separator I used between the artist's name and the song's name

    //what I want to do basically
    if (artistList.Contains(splitted[0]))
    {
        artistList.GetArtist(splitted[0]).songs.Add(splitted[1]);
        //if artistList contains this artist already, add this song to it
    }
    else
    {
        Artist artist = new Artist();
        artist.name = splitted[0];
        artist.songs.Add(splitted[1]);
        //if it doesn't contain, add a new artist to the list
    }
}

这对我来说很难解释,我希望你们能理解我正在尝试做的事情。我仍然很缺乏经验,也不了解C#和一般编程中某些东西的所有正确术语。

1 个答案:

答案 0 :(得分:2)

要根据艺术家名称(您的Artist类中的字符串属性)从artistList中查找Artist的实例,可以使用Linq

类似

foreach (string s in filesList)
{
    string newS = s.Replace(path, "");
    string[] splitted = s.Split(@"!@=-@!"); //this is the separator I used between the artist's name and the song's name
     //Here  splitted[0] is artist name and splitted[1] is song name
     //Then
     var existingArtist = artistList.FirstOrDefault(x => x.Name == splitted[0]);
     //^^^ FirstOrDefault clause while give you instance of Artist based on condition/predicate


    //Null check for checking Artist is already exist in list or not.
    if(existingArtist != null)
       existingArtist.songs.Add(splitted[1])
    else
    {
        Artist artist = new Artist();
        artist.name = splitted[0];
        artist.songs.Add(splitted[1]);
        artistList.Add(artist); //Bonus : This was missing in your code
    }
}

有关Linq FirstOrDefault / SingleOrDefault /的更多信息,

FirstOrDefault() :

  

返回序列的第一个元素,如果没有则返回默认值   找到元素。   我在回答中使用了FirstOrDefault。

SingleOrDefault() :

  

返回序列的单个特定元素或默认值   如果找不到该元素。

Where() :

  

根据谓词过滤一系列值。

阅读并检查哪种方法适合您。