C# 为什么我会得到一个“;序列不包含任何元素”;错误?

C# 为什么我会得到一个“;序列不包含任何元素”;错误?,c#,C#,我使用以下方法将字符串的第一个字符转换为大写,并在末尾添加句点: public static string toUpper (string mytext) { if (string.IsNullOrEmpty(mytext) || mytext == "") return mytext; mytext = mytext.Trim(); if (mytext.EndsWith(".")) { mytext = mytext.First().ToStr

我使用以下方法将字符串的第一个字符转换为大写,并在末尾添加句点:

public static string toUpper (string mytext)
{
    if (string.IsNullOrEmpty(mytext) || mytext == "") return mytext;

    mytext = mytext.Trim();

    if (mytext.EndsWith("."))
    {
      mytext = mytext.First().ToString(CultureInfo.InvariantCulture).ToUpper()
             + string.Join("", mytext.Skip(1))
             ;
    }
    else
    {
      mytext = mytext.First().ToString(CultureInfo.InvariantCulture).ToUpper()
             + string.Join("", mytext.Skip(1))
             + "."
             ;
    }
    return mytext;
}
如果此行的mytext=“”,则我得到的错误序列不包含任何元素:

 mytext = mytext.First().ToString(CultureInfo.InvariantCulture).ToUpper()
        + string.Join("", mytext.Skip(1))
        + "."
        ;

非常感谢您的建议。

请使用firstordefault()而不是first()。如果Trim()方法之后没有元素,则首先引发异常,结果可能是一个空字符串,这将导致在尝试获取第一个(不存在)字符时出现异常。

在检查mytext之前,应先修剪mytext。IsNullOrEmpty也可以用在“独立”上。因此,请尝试:

mytext = mytext.Trim();
if (string.IsNullOrEmpty(mytext)) return mytext;

另外,如果mytext的长度为1个字符,则Skip(1)将失败。

您的代码有错误。我用下面的方法修改了它

public static string toUpper(string mytext)
        {
            if (String.IsNullOrWhiteSpace(mytext)) { return mytext; }

            mytext = mytext.Trim();

            if (mytext.EndsWith("."))
            {
                if (mytext.Length == 1)
                {
                    return mytext;
                }
                else
                {
                    string first = mytext.First();
                    mytext = String.Join(first.ToUpper(), mytext.Substring(1));
                }
            }
            else
            {
                if (mytext.Length == 1)
                {
                    mytext = String.Join(mytext.ToUpper, ".");
                }
                else
                {
                    string first = mytext.First();
                    mytext = String.Join(first.ToUpper(), mytext.Substring(1));
                }

            }
            return mytext;
        }

看起来比它应有的复杂多了

我会追求优雅并使用正则表达式:

public static string toUpper( string s )
{
  string value = null ;
  if ( s != null )
  {
    // match length 1: it's the first first character: upper-case it
    // match length 0: the last character isn't a period. append it
    value = rx.Replace( s.Trim() , m => m.Length == 1 ? m.Value.ToUpper( CultureInfo.InvariantCulture ) : "." ) ;
  }
  return value ;
}
static readonly Regex rx = new Regex( @"(^.)|($(?<=[^\.]" ) ;

我本来没有读到这个问题。如果mytext中只有空格,您的第一个if将产生错误。。。请改用if(String.IsNullOrWhitespace(mytext)| | mytext==“”)。第二个条件(
mytext==“”
)是多余的。已同意并应删除…-1,因为即使这样可以防止异常,也会产生不正确的结果。请定义不正确的结果!!!不要简单地投反对票。他说他遇到了异常,我的修复程序应该可以解决。如果您认为我的ans帮助了您,请将其标记为答案。@qamar
FirstOrDefault()
将返回
default(char)
,然后将其转换为一个非空字符串。@qamar您没有理解某些内容。好的答案被投票支持,但并非所有被接受的答案都是好的。这只是意味着它帮助了OP,但也许这是一个不好的建议。谢谢Nicholas,我使用了字符串生成器解决方案。谢谢Dan的帮助。
public static string toUpper( string s )
{
  if ( s == null ) return null ;

  StringBuilder sb = new StringBuilder( s.Trim() ) ;
  if ( sb.Length > 0 )
  {
    sb[0] = char.ToUpper(sb[0] , CultureInfo.InvariantCulture ) ;
    if ( sb[ sb.Length-1] != '.' ) sb.Append('.') ;
  }
  value = sb.ToString() ;
  return value ;
}