【问题标题】:.NET char array comparison.NET 字符数组比较
【发布时间】:2011-05-19 20:21:35
【问题描述】:

我有以下 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”作为输出。我错过了什么?

【问题讨论】:

    标签: c# char


    【解决方案1】:

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

    【讨论】:

    • MSDN 说“两个集合的集合差异定义为第一个集合的成员没有出现在第二个集合中。”
    • 这将为您的第一个 sn-p 生成 bool[] 而不是 char[],并为第二个生成编译器错误。
    • 此外,在发布的示例中,“i”和“m”被删除,但这些字母在原始字符串中不重复。
    • @e28Makaveli:确实,但是所有 LINQ 集合运算符都会产生不同的结果。这些是他们行为中不矛盾的方面。
    • @Jon:实际上,我应该记住这一点。许多核心 BCL 类还没有可以很好地处理序列的重载或方法,这是我的挫败感之一。
    【解决方案2】:

    您错过了 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);
    }
    

    【讨论】:

    • 关于ToCharArray(),我敢打赌他使用的是VS2008,它隐藏了intellisense字符串上的扩展方法......
    • @digEmAll:很有可能。幸运的是它不会阻止它实际编译:)
    【解决方案3】:

    显然出了点问题,因为删除了一个“c”而不是另一个!我会看this solution

    【讨论】:

      【解决方案4】:

      试试这个:

      return new string(fileNameCandidate.Where(c => !invalids.Contains(c)).ToArray());
      

      【讨论】:

        猜你喜欢
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多