无法隐式转换类型"字符串" to" string []"

时间:2015-09-16 15:34:10

标签: c# wpf

我尝试使用名称和路径向列表框添加项目,我收到了这样的错误:

  

无法隐式将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);
}

5 个答案:

答案 0 :(得分:4)

您已声明:

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); 
}

答案 1 :(得分:0)

您已将FileNameFilePath定义为string[]。看起来你打算每个都包含单个字符串值。

string[] FileName, FilePath;

将其更改为string

string FileName, FilePath;

答案 2 :(得分:0)

string[] FileName, FilePath;

您将FileNameFilePath声明为数组,但FullNameName都返回string,因此错误。

FileSystemInfo.FullName Property
FileSystemInfo.Name Property

将您的声明更改为:

    string FileName, FilePath;

答案 3 :(得分:0)

问题是FileNameFilePath被声明为string[],但您正在尝试为其分配string。但是,由于您说您尝试添加包含名称和路径到列表框的文件列表,因此您根本不需要FileNameFilePath个变量。更容易的是设置DataSource的{​​{1}}并设置要显示的对象的属性:

ListBox

然后,当到达获取所选项目时,将其强制转换为FileInfo:

listbox2.DisplayMember = "Name"; //The Name property from FileInfo
listbox2.DataSource = files;

答案 4 :(得分:0)

在单个foreach循环中简单地声明FileNamesFilePaths来输入List<string>并执行Add可能会更好,但这里有一个替代品。

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方法的优点是,在添加项目时,您不会通过FileNamesFilePaths进行枚举