我是C#的新手,所以这对我来说很难说出来。
我正在创建媒体应用程序,并且有一个类(称为MediaFile),其中包含有关媒体文件的信息(名称,大小,播放计数和标签)。它们分别是字符串,双精度型,整数和List<string>
类型。
我有这些对象的列表,因此例如调用MediaFile[2].Tags
将引用“标签”字符串(相关关键字)的列表。
我遇到的问题是,当我要求用户输入所选MediaFile的标签时,每当我尝试将这些标签保存到该特定对象时,这些标签都会保存到每个对象中。当前分配的代码如下所示:
MediaFile[lstLibrary.SelectedIndices[0]].Tags.Add(tempTag);
'tempTag'是我要添加到字符串列表中的字符串,但是就像我说的-即使只选择了一个文件,'tempTag'字符串也被添加到每个MediaFile的字符串列表中。
谁能告诉我我在做什么错?
非常感谢。
编辑:感谢您的所有答复。每当创建
MediaFile
实例时,我都会将new List<string>
传递给构造函数。然后稍后,当我去更改此字符串列表时,我发现所有MediaFiles似乎都具有相同的字符串引用。这是MediaFile类:public static List<MediaType> MediaFile = new List<MediaType>();
public class MediaType
{
public string Name;
public string Path;
public double Size;
public int Plays;
public List<string> Tags;
// Constructor for adding new files
public MediaType(string path, List<string> tags)
{
Path = path;
Tags = tags;
}
在我要求用户选择要添加到媒体库的文件后:
MediaFile.Add(new MediaType(Path.GetFullPath(file), new List<string>()));
因此,一开始没有“标签”,但随后又没有了(这是我的问题所在):
if (tempTag != "")
MediaFile[lstLibrary.SelectedIndices[0]].Tags.Add(tempTag);
}
任何的想法?抱歉,这篇文章太长了!
最佳答案
这表明您已经向所有MediaFiles添加了相同的字符串引用。换句话说,您可能已经完成:
List<string> tags = new List<string>();
for (int i = 0; i < 100; i++)
{
MediaFile file = new MediaFile(tags);
MediaFiles.Add(file);
}
这非常容易测试-只需检查
MediaFile[0].Tags == MediaFile[1].Tags
-我怀疑您会发现计算结果为True,这意味着两个文件都使用相同的列表。相反,您应该为每个
List<string>
实例创建一个新的MediaFile
。当然,如果您可以发布一些代码,那将有助于我们更精确地解决问题。
关于c# - C#List <string>分配问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3787282/