.NET char数组比较

时间:2010-12-03 16:14:31

标签: 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);
}

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

4 个答案:

答案 0 :(得分:5)

Enumerable.Except()产生两个序列的“设置差异” - 这意味着输入中的重复字符也将被删除。

你想要的是:

 _name.Where( x => !invalids.Contains(x) ).ToArray();

由于System.StringIEnumerable<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());