[英]Cannot implicitly convert type "string" to "string[]"
我正在尝试使用名称和路径将项目添加到列表框,我收到此错误:
不能将类型
string
隐式转换为string[]
string path = textbox1.Text;
string[] FileName, FilePath;
DirectoryInfo directoryInfo = new DirectoryInfo(path);
FileInfo[] files = directoryInfo.GetFiles();
foreach( FileInfo fileInfo in files)
{
FileName = fileInfo.FullName; // Here
FilePath = fileInfo.Name; // and here
listbox2.Items.Add(fileInfo.FullName);
}
你已经声明了这一点:
string[] FileName, FilePath;
所以分配这个:
FileName = fileInfo.FullName; // Here
FilePath = fileInfo.Name; // and here
将字符串(例如,fileInfo.FullName 是一个字符串)分配给字符串数组。
您要做的是列出这些,因此定义列表并添加值:
string path = textbox1.Text;
var FileNames = new List<string>();
var FilePaths = new List<string>();
DirectoryInfo directoryInfo = new DirectoryInfo(path);
FileInfo[] files = directoryInfo.GetFiles();
foreach( FileInfo fileInfo in files) {
FileNames.Add(fileInfo.FullName); // Here
FilePaths.Add(fileInfo.Name); // and here
listbox2.Items.Add(fileInfo.FullName);
}
您已将FileName
和FilePath
定义为string[]
。 看起来您希望它们每个都包含单个字符串值。
string[] FileName, FilePath;
将它们更改为string
string FileName, FilePath;
string[] FileName, FilePath;
您将FileName
和FilePath
声明为数组,但FullName
和Name
都返回string
,因此出现错误。
FileSystemInfo.FullName 属性
FileSystemInfo.Name 属性
将您的声明更改为:
string FileName, FilePath;
问题是FileName
和FilePath
被声明为string[]
,但您试图为它们分配一个string
。 但是,由于您说要尝试将具有名称和路径的文件列表添加到列表框,因此您根本不需要FileName
或FilePath
变量。 更容易的是设置ListBox
的DataSource
并设置要显示的对象的哪个属性:
listbox2.DisplayMember = "Name"; //The Name property from FileInfo
listbox2.DataSource = files;
然后,当需要获取所选项目时,将其转换为 FileInfo:
var selectedFileInfo = (FileInfo)listbox2.SelectedItem;
var selectedFileName = selectedFileInfo.Name;
//etc
简单地声明FileNames
和FilePaths
以键入List<string>
并在单个 foreach 循环中执行Add
可能会更好,但这里有一个 linq 替代方案。
string[] FileNames, FilePaths;
在两个 linq 操作中使用匿名函数委托。
FileNames = files.Select( f => f.FullName).ToArray();
FilePaths = files.Select( f => f.Name).ToArray();
listBox2.AddRange(files.Select(FileNames)); //AddRange can take either IEnumerable<T> or T[] as a parameter
如果您事先构建表达式,它会变得更加清晰(并且可能更加优化),因为您没有声明匿名委托函数。
// these can be declared out of function scope as readonly..
Func<FileInfo, string> SelectFullName = (f) => f.FullName;
Func<FileInfo, string> SelectName = (f) => f.Name;
FileNames = files.Select(SelectFullName).ToArray();
FilePaths = files.Select(SelectName).ToArray();
listBox2.AddRange(FileNames);
linq 方法的优点是在添加项目时您不会通过FileNames
和FilePaths
进行枚举
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.