C#string.IsNullOrWhiteSpace(";\t";)==true

C#string.IsNullOrWhiteSpace(";\t";)==true,c#,C#,我有一行代码 var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) ? "," : foundDelimiter; 当foundDelimiter为“\t”时,string.IsNullOrWhiteSpace返回true 为什么??解决这个问题的合适方法是什么 \t是制表符,即空白。在C#中,您可以执行以下任一操作以获得选项卡: var tab1 = "\t"; var tab2 = " "; var areEqual =

我有一行代码

var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) ? "," : foundDelimiter;
foundDelimiter
“\t”
时,string.IsNullOrWhiteSpace返回true


为什么??解决这个问题的合适方法是什么

\t
是制表符,即空白。在C#中,您可以执行以下任一操作以获得选项卡:

var tab1 = "\t";
var tab2 = "    ";

var areEqual = tab1 == tab2; //returns true
编辑:正如Magus所指出的,当答案呈现时,将制表符转换为空格也是如此。如果你在IDE中,你只需点击quote,tab,quote

就解决方法而言,我建议您只需在条件语句中添加选项卡检查

var delimiter = string.IsNullOrWhiteSpace(foundDelimiter) && foundDelimiter != "\t" ? "," : foundDelimiter;
欢迎使用Unicode

你以为会发生什么?HT(水平制表符)几十年来一直是空白字符。空白字符的“经典”C语言定义由US-ASCII字符组成:

  • SP
    :空格(0x20,
    “”
  • HT
    :水平选项卡(0x09,
    '\t'
  • LF
    :换行符(0x0A,
    “\n”
  • VT
    :垂直选项卡(0x0B,
    '\v'
  • FF
    :垂直选项卡(0x0C,
    “\f”
  • CR
    :回车(0x0C,
    “\r”
Unicode在其方法上有点…普遍性:它对空白字符的定义如下:

  • Unicode类别空格分隔符的成员:

    • 空格
      (U+0020)
    • OGHAM空格标记
      (U+1680)
    • 蒙古语元音分隔符
      (U+180E)
    • EN-QUAD
      (U+2000)
    • EM-QUAD
      (U+2001)
    • EN SPACE
      (U+2002)
    • EM空间
      (U+2003)
    • 每EM空间三个
      (U+2004)
    • 每EM空间四个
      (U+2005)
    • 6个/EM空间
      (U+2006)
    • 图形空间
      (U+2007)
    • 标点符号空间
      (U+2008)
    • 精简空间
      (U+2009)
    • 头发空间
      (U+200A)
    • 狭窄的不间断空间
      (U+202F)
    • 中等数学空间
      (U+205F)
    • 表意空间
      (U+3000)
  • Unicode类别LineSeparator的成员,它仅由

    • 行分隔符
      (U+2028)
  • Unicode类别段落分隔符的成员,该分隔符仅由

    • 段落分隔符
      (U+2029)
  • 这些基本拉丁/C0控件/US-ASCII字符:

    • 字符列表
      (U+0009)
    • 换行
      (U+000A)
    • 行列表
      (U+000B)
    • 表单提要
      (U+000C)
    • 回车
      (U+000D)
  • 这些C1控件和拉丁语-1补充字符

    • 下一行
      (U+0085)
    • 无中断空间
      (U+00A0)
如果您不喜欢该定义,请沿着以下几行滚动您自己的定义(插入您自己的角色集):

您可能还需要添加一个
char
模拟:

public static bool IsCLanguageWhitespace( this char c )
{
  bool value ;
  switch ( c )
  {
  case ' '  : value = true  ; break ;
  case '\t' : value = true  ; break ;
  case '\n' : value = true  ; break ;
  case '\v' : value = true  ; break ;
  case '\f' : value = true  ; break ;
  case '\r' : value = true  ; break ;
  default   : value = false ; break ;
  }
  return  value ;
}

另外,仅供参考:正如viggity所说,该函数是正确的。您可以创建一个if,使其按您想要的方式工作。那么就Visual Studio而言,
“\t”
是否完全等效?@Sabe和Silvermind将其选项卡转换为四个空格。在编辑模式下,它是一个选项卡。但是,是的,在编程语言中,制表符通常在字符串中表示为
\t
,这样您就可以识别它,但在C语言中,制表符也可以按字面意思使用;这两个字符是等效的。@Sabe No.制表符是一个字符。它可能表示的空间数完全取决于上下文。如果你不是在寻找空白,请使用
String.IsNullOrEmpty(…)
我不明白为什么这被否决了,这是一个诚实的错误。你为什么要解决它?很明显,您要替换空白,制表符是空白字符,就像普通的空格字符一样。请参见
空格、制表符、换行符、回车符、换行符、垂直制表符和换行符都称为“空白字符”
制表符是它自己的字符,它只是一个空白字符。它的显示方式完全取决于上下文。按照我的口味,unicode在这里不太实用。我当前的用例是尝试使用Unicode类别来区分水平空间和垂直空间。但是没有。。。我将不得不创建一个查找表,而不是使用
System.Globalization.CharUnicodeInfo.getunicodecegory(c)
。干得好,官僚们!;)
public static bool IsCLanguageWhitespace( this char c )
{
  bool value ;
  switch ( c )
  {
  case ' '  : value = true  ; break ;
  case '\t' : value = true  ; break ;
  case '\n' : value = true  ; break ;
  case '\v' : value = true  ; break ;
  case '\f' : value = true  ; break ;
  case '\r' : value = true  ; break ;
  default   : value = false ; break ;
  }
  return  value ;
}