C# 将stringbuilder中的空值转换为;“不可用”;一串

C# 将stringbuilder中的空值转换为;“不可用”;一串,c#,C#,我是C#的新手。我已经编辑了现有的代码,以完成大部分我希望它完成的任务。当有数据时,这会正常工作。然而,当MAXGUST和deposition有空值时,我会得到错误。城市和国家总是有价值的。是否可以在我的StringBuilder中插入if/then语句 if (obj.Properties().Any(x => x.Name == "CITY") && obj.Properties().Any(x => x.Name == "STATE")) { var c

我是C#的新手。我已经编辑了现有的代码,以完成大部分我希望它完成的任务。当有数据时,这会正常工作。然而,当MAXGUST和deposition有空值时,我会得到错误。城市和国家总是有价值的。是否可以在我的StringBuilder中插入if/then语句

if (obj.Properties().Any(x => x.Name == "CITY") && obj.Properties().Any(x => x.Name == "STATE"))
{
    var city1 = obj.Properties().Where(x => x.Name == "CITY").Select(y => y.Value.Value<string>()).FirstOrDefault();
    var state1 = obj.Properties().Where(x => x.Name == "STATE").Select(y => y.Value.Value<string>()).FirstOrDefault();
    var maxGust = obj.Properties().Where(x => x.Name == "MAXGUST").Select(y => y.Value.Value<int>()).FirstOrDefault();
    var precip = obj.Properties().Where(x => x.Name == "PRECIPITATION").Select(y => y.Value.Value<float>()).FirstOrDefault();

    this.Description =
            new StringBuilder().Append(city1).Append(", ").Append(state1)
            .Append("<br />").Append(maxGust).Append(" MPH Gust")
            .Append("<br />").Append(precip).Append(" in").ToString();

}
if(obj.Properties().Any(x=>x.Name==“CITY”)&&obj.Properties().Any(x=>x.Name==“STATE”))
{
var city1=obj.Properties()。其中(x=>x.Name==“CITY”)。选择(y=>y.Value.Value()).FirstOrDefault();
var state1=obj.Properties()。其中(x=>x.Name==“STATE”)。选择(y=>y.Value.Value()).FirstOrDefault();
var maxGust=obj.Properties()。其中(x=>x.Name==“maxGust”)。选择(y=>y.Value.Value()).FirstOrDefault();
var precip=obj.Properties()。其中(x=>x.Name==“沉淀”)。选择(y=>y.Value.Value()).FirstOrDefault();
这个。描述=
新建StringBuilder().Append(city1.Append(“,”).Append(state1)
.Append(“
”).Append(maxGust)。Append(“MPH阵风”) .Append(“
”).Append(precip.Append(“in”).ToString(); }
您可以使用
??
运算符,如果左操作数为空,该运算符将返回右操作数

.Append(maxGust ?? "not available")...



编辑:上述答案在您的情况下不起作用,因为
maxGust
的类型为
int
,不能为空。因此,对于您当前的代码,这个问题实际上没有意义。如果
maxGust
可能没有值,那么它应该是
int?
类型(与
Nullable
相同),如果没有值,分配它的表达式应该修改为返回null。

您不需要将所有这些表达式链接在一起。将它们分开,您可以使用普通条件:

var sb = new StringBuilder();
if (myVariable != null)
{
    sb.Append(myVariable);
}

...

this.Description = sb.ToString();

由于maxGust
的类型为
int
并且
precip
是一个
float`,它们永远不能为空,所以您必须用它们的默认值(0,0f)检查它们

比如:


考虑使用
string.Format
,您确实不必一次性使用
StringBuilder

precip=precip??“您的字符串”为什么不使用
string.Format
?为什么要为此创建stringbuilder?出现了什么错误?@Guffa我得到的是空值,无法转换为值类型。我想错误就在我声明变量时发生的地方。谢谢。我有个错误。“运算符”不能应用于int和string类型的操作数“
maxGust
int
类型,
precip
是浮点型,它们永远不能为空,而是必须用它们的默认值(0,0f)检查它们@Andrew,实际上它不适用于值类型。。。但是,如果maxGust不能为null,那么您的需求就没有意义了。考虑使用可空类型,而不是错误答案。这不起作用,因为
int
string
是不同的。谢谢你,我来试试。实际上,我还有几个int变量要连接。@Andrew,仍然不要使用
StringBuilder
,StringBuilder在多次迭代中创建字符串的情况下非常有用。一旦运行应用程序,我的应用程序中就会出现“空值无法转换为值类型”的错误。我注释掉了所有stringbuilder代码,因此它必须出现在我的maxGust和precip的var语句中。您需要使用
int?
float?
,它们支持可为空的值,然后比较使用
maxGust!=空
。。。
.Append(maxGust != default(int) ? maxGust.ToString() : " not available ")
.Append(precip != default(float) ? precip.ToString() : " not available ") 
        //or precip != 0f