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帮助了您,请将其标记为答案。@qamarFirstOrDefault()
将返回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 ;
}