将两个char数组作为单个字符串返回的正确方法是什么?

时间:2013-01-06 20:40:43

标签: c# string properties path char

我在静态类中有一个公共属性,我想用它来验证用户对非法文件和路径名的输入。

目前我有这个:

private static string invalidFileNames = new string(Path.GetInvalidFileNameChars());

private static string invalidPathNames = new string(Path.GetInvalidPathChars());

private static string invalidUserInput = (invalidFileNames + invalidPathNames); 

public static string InvalidUserInput
{

    get { return invalidUserInput; }

}

基于Microsoft的文档here我希望能够回复"<>|"<>|但我得到的只是第一个"<>|

任何人都可以了解这里发生的事情吗?我如何确保我返回两个字符串?

4 个答案:

答案 0 :(得分:1)

您无法在调试器中看到它们,但您可以将它们输出到文件中并使用比记事本更好的编辑器来查看它们,例如notepad ++

File.WriteAllText("tmp.txt", invalidUserInput, UTF8Encoding.GetEncoding("UTF-8"));

Screen shot from notepad++

答案 1 :(得分:1)

您可以将其设为单个字符串

using System.Linq;

public static string InvalidUserInput
{
    get 
    {
        return new string(Path.GetInvalidFileNameChars()
                  .Concat(Path.GetInvalidPathChars())
                  .Distinct()
                  .ToArray());
    }
}

你不会在TextBox中看到它们,因为在你的情况下InvalidUserInput中的终结符类型字符是\0(null tminator)它停止显示。

如果您只想显示对用户有意义的内容,您可以使用Char.IsControl

删除导致问题的内容

这是一个将所有内容包装起来的静态类

public static class StringExtentions
{
    private static string _invalidUserInput = string.Empty;
    private static string _PrinatbleInvalidUserInput = string.Empty;

    public static string InvalidUserInput
    {
        get
        {
            if (_invalidUserInput == string.Empty)
            {
                _invalidUserInput = new string(Path.GetInvalidFileNameChars()
                      .Concat(Path.GetInvalidPathChars())
                      .Distinct()
                      .ToArray());
            }
            return _invalidUserInput;
        }
    }

    public static string GetPrinatbleInvalidUserInput
    {
        get
        {
            if (_PrinatbleInvalidUserInput == string.Empty)
            {
                _PrinatbleInvalidUserInput = new string(InvalidUserInput.Where(x => !char.IsControl(x)).ToArray());
            }
            return _PrinatbleInvalidUserInput;
        }
    }

    public static bool IsValidUserInput(this string str)
    {
        return !str.Any(c => InvalidUserInput.Contains(c));
    }
}

用法:

public MainWindow()
{
    InitializeComponent();
    string myString = "C:\\InvalidPath<";

    if (!myString.IsValidUserInput())
    {
        MessageBox.Show(string.Format("String cannot contain {0}", StringExtentions.GetPrinatbleInvalidUserInput));
    }
}

答案 2 :(得分:1)

在这种情况下,因为您可能会多次使用数据,所以您只想记录两个字符数组之间唯一的字符。为此,您可以使用Union方法,如下所示:

private static string invalidUserInput = new string(Path.GetInvalidFileNameChars().Union(Path.GetInvalidPathChars()).ToArray()); 

答案 3 :(得分:0)

运行代码会返回许多unicode字符:

"<>|□□□□□□□□□  
□□
□□□□□□□□□□□□□□□□□□:*?\/"<>|□□□□□□□□□  
□□
□□□□□□□□□□□□□□□□□□

由于unicode字符,你确定你没有丢失任何东西吗?

另外,那是你的完全代码吗?如果切换变量初始化的顺序,它将不再有效,因为invalidUserInput必须在其他两个之后进行评估(它们按照在代码中定义的顺序进行评估)。