.NET char数组比较

Kla*_*Nji 0 c# char

我有以下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);
}
Run Code Online (Sandbox Code Playgroud)

我所期望的是原始名称,其中删除了残留的无效字符.但是,我得到的是具有无效文件名字符的原始名称和其他删除的名称.
例如,如果我使用"ems:almcc_srr_view"作为输入参数调用方法,我期望"emsalmcc_srr_view作为输出.我得到的是"emsalc_rviw"作为输出.我错过了什么?

LBu*_*kin 5

Enumerable.Except()产生两个序列的"集合差异" - 这意味着输入中的重复字符也将被消除.

你想要的是:

 _name.Where( x => !invalids.Contains(x) ).ToArray();
Run Code Online (Sandbox Code Playgroud)

由于System.StringIS IEnumerable<char>,可以简化这:

var name = fileNameCandidate.Where( x => !invalids.Contains(x) ).ToArray() );
return new string( name );
Run Code Online (Sandbox Code Playgroud)

  • 那将为你的第一个片段产生一个`bool []`而不是一个`char []`,为第二个片段产生一个编译器错误. (2认同)