我有一个歌词应用程序,用户可以在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#和一般编程中某些东西的所有正确术语。
答案 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。
返回序列的单个特定元素或默认值 如果找不到该元素。
根据谓词过滤一系列值。
阅读并检查哪种方法适合您。