Проблема вызвана этим: musicFiles.Clear();
и это MusicFiles = musicFiles
.Вы присваиваете переменную musicFiles
, которая является ссылочным типом в c # (список), каждому MusicItem
.Все они (музыкальные элементы) указывают на одну и ту же ссылку в списке, поэтому при вызове Clear
каждый, у кого есть ссылка, «увидит» изменения.Точно так же, когда ваш цикл заканчивается и заполняет musicFiles
, все MusicItems
будут иметь одинаковые значения, так как они указывают на одну и ту же ссылку.
По сути, как работают переменные C #, так что хорошо, что вы понимаете это.Это не слишком сложно, вам просто нужно немного почитать / попрактиковаться, чтобы обдумать это.
Я настоятельно рекомендую вам прочитать эти две замечательные статьи, написанные Джоном Скитом Ссылки и значения и позже Передача параметров в C # .На мой взгляд, его объяснение является одним из лучших, которые я когда-либо видел на эту тему.Это сжато и ясно.Но убедитесь, что вы получите его, потому что это очень важно для работы C #, и это сделает вашу жизнь намного проще / лучше для разработчика.
Решение вашей проблемы:
Вы можете решить ее немногоизменив код на:
public IActionResult Files(string folder)
{
List<MusicItems> MusicList = new List<MusicItems>();
foreach (string folderName in folders)
{
// creates an item with an empty list of files
var musicItem = new MusicItems { Name = folderName, MusicFiles = new List<MusicFile>() };
foreach(var file in files)
{
// create the file
musicFile = new MusicFile { Display = display, Url = MakeVirtualPath(fileName) };
// add the file to the item, declared in the loop.
musicItem.MusicFiles.Add(musicFile);
}
MusicList.Add(musicItem);
}
return View(MusicList);
}