我有以下c#方法从提议的名称中获取有效的文件名:
public static string GetValidFilename(string fileNameCandidate)
{
var invalids = System.IO.Path.GetInvalidFileNameChars();
var _name = fileNameCandidate.ToCharArray();
var validName = _name.Except(invalids).ToArray();
return new string(validName);
}
我所期望的是原始名称,其中删除了残留的无效字符。但是,我得到的是原始名称,文件名字符无效,其他名称已删除 例如,如果我用" ems调用方法:almcc_srr_view"作为输入参数,我期望" emsalmcc_srr_view作为输出。我得到的是" emsalc_rviw"作为输出。我错过了什么?
答案 0 :(得分:5)
Enumerable.Except()产生两个序列的“设置差异” - 这意味着输入中的重复字符也将被删除。
你想要的是:
_name.Where( x => !invalids.Contains(x) ).ToArray();
由于System.String
为IEnumerable<char>
,您可以将其简化为:
var name = fileNameCandidate.Where( x => !invalids.Contains(x) ).ToArray() );
return new string( name );
答案 1 :(得分:4)
您错过了Except
是 set 操作的事实。换句话说,它产生一个不包含任何重复的序列。 (不可否认,在这一点上,文件可能会更加清晰。)
你想:
var validName = _name.Where(c => !invalids.Contains(c)).ToArray();
请注意,您无需致电_name.ToCharArray()
,因为string
已实施IEnumerable<char>
。换句话说,您可以使用:
public static string GetValidFilename(string fileNameCandidate)
{
var invalids = Path.GetInvalidFileNameChars();
var validName = fileNameCandidate.Where(c => !invalids.Contains(c))
.ToArray();
return new string(validName);
}
答案 2 :(得分:0)
显然有些事情出了问题,因为一个'c'已被删除而另一个'c'已被删除!我会看this solution。
答案 3 :(得分:0)
请改为尝试:
return new string(fileNameCandidate.Where(c => !invalids.Contains(c)).ToArray());