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

C# 将两个字符数组作为单个字符串返回的正确方法是什么?,c#,string,properties,path,char,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

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

目前我有:

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

}
根据微软的文档,我希望能得到
“|”
,但我得到的只是第一个
“|


有人能解释一下这里发生了什么吗?如何确保返回两个字符串?

运行代码会返回大量unicode字符:

"<>|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□:*?\/"<>|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□ "|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□:*?\/"|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□ 你确定你没有因为unicode字符而丢失任何东西吗


另外,这是您的确切代码吗?如果您切换变量初始化的顺序,它将不再起作用,因为必须在其他两个之后计算
invalidUserInput
(它们按照代码中定义的顺序进行计算)。

运行代码会返回大量unicode字符:

"<>|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□:*?\/"<>|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□ "|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□:*?\/"|□□□□□□□□□ □□ □□□□□□□□□□□□□□□□□□ 你确定你没有因为unicode字符而丢失任何东西吗


另外,这是您的确切代码吗?如果您切换变量初始化的顺序,它将不再工作,因为必须在其他两个之后计算
invalidUserInput
(按照代码中定义的顺序计算).

在调试器中看不到它们,但可以将它们输出到文件中,并使用比记事本更好的编辑器(如记事本)查看它们++

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

在调试器中看不到它们,但可以将它们输出到文件中,并使用比记事本更好的编辑器(如记事本)查看它们++

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

你可以把它做成一个字符串

using System.Linq;

public static string InvalidUserInput
{
    get 
    {
        return new string(Path.GetInvalidFileNameChars()
                  .Concat(Path.GetInvalidPathChars())
                  .Distinct()
                  .ToArray());
    }
}
由于
InvalidUserInput
中的终止符类型字符,您无法在文本框中看到所有字符。在您的情况下,是
\0
(null teminator)停止了显示

如果只想显示对用户有意义的内容,可以使用
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));
    }
}
public主窗口()
{
初始化组件();

string myString=“C:\\InvalidPath您可以将其设置为单个字符串

using System.Linq;

public static string InvalidUserInput
{
    get 
    {
        return new string(Path.GetInvalidFileNameChars()
                  .Concat(Path.GetInvalidPathChars())
                  .Distinct()
                  .ToArray());
    }
}
由于
InvalidUserInput
中的终止符类型字符,您无法在文本框中看到所有字符。在您的情况下,是
\0
(null teminator)停止了显示

如果只想显示对用户有意义的内容,可以使用
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));
    }
}
public主窗口()
{
初始化组件();

string myString=“C:\\InvalidPath在这种情况下,由于您可能会多次使用数据,因此您只希望记录两个字符数组之间唯一的字符。为此,您可以使用以下方法:

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

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

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

就诊断问题而言,您尝试了什么?您是否考虑过分别返回两个组件字符串,以确保它们包含您认为应该包含的内容?将
InvalidUserInput
赋值给变量似乎为我返回了正确的值。@David-如果我注释掉两个字符数组并用字符串a”和“字符串b”我按预期返回字符串a和字符串b(stringastringb),但是,如果我使用私有静态字符串invalidPathNames=“字符串b”则返回的是|就诊断问题而言,您尝试过什么?您是否考虑过分别返回两个组件字符串以确保它们包含您认为应该包含的内容?将
InvalidUserInput
赋值给变量似乎为我返回了正确的值。@David-如果我注释掉两个字符数组并用“字符串a”和“字符串b”按预期返回字符串a和字符串b(stringastringb),但是,如果使用私有静态字符串invalidPathNames=“字符串b”,则返回的结果是”|我喜欢这个建议,但是.Concat位给了我以下错误-“System.Array”不包含“Concat”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Concat”(您是否缺少using指令或程序集引用?我的源代码顶部有using System;。谢谢,sa_ddam213,using System。Linq已解决此错误。出于测试目的,我将返回的字符串输出到文本框,但我仍然只看到|有。您希望看到什么?TextBox永远不会显示像`\a\b\t\n\v\f`这样的字符,这很公平,但是为什么“this string”不会与“|如果我将其附加到私有静态字符串invalidFileNames=new string(Path.GetInvalidFileNameChars());”一起返回?因为“|”之后是“\0”“它终止字符串。请参阅此处了解更多详细信息:我喜欢此建议,但.Concat位给了我以下错误-'System.Array'不包含'Concat'的定义,并且找不到接受'System.Array'类型的第一个参数的扩展方法'Concat'。”(您是否缺少using指令或程序集引用?我的源代码顶部有using System;。谢谢,sa_ddam213,using System。Linq已解决错误。出于测试目的,我将返回的字符串输出到文本框,但我仍然只看到“|那里。您希望看到什么?文本框