我正在创建一个包含自定义对象值的字符串数组,如下所示:
foreach(MyObject o in MyObjectList)
string[] myArray = new string[] {o.id, o.number.toString(), o.whatever, ...}
这里的问题是,任何这些值都可以为NULL,这使得此代码崩溃。让我们说o.number是NULL而其余的不是......在这种情况下我仍然想要填充其他值并放入" NULL"作为字符串而不是o.number。
除了检查每个值之外,还有一个很好的方法吗?
谢谢:)
答案 0 :(得分:3)
你需要检查每个值,但使用它不应该太糟糕?运算符,所以只需要为每个值做:
o.id ?? "NULL"
答案 1 :(得分:3)
对于相关的项目,我经常定义一个扩展方法ToStringOrNull
,如下所示:
public static string ToStringOrNull(this object o) {
return o == null ? null : o.ToString();
}
为了避免智能感知污染,如果碰巧有一组有限的类型ToStringOrNull
是有用的,你可以(我有时会)避免将扩展名添加到object
而是复制粘贴相关类型的一堆副本。该函数很容易编写为单行,因此解决这种复制的代码是过度的。
然后,如果您希望用一些占位符文本替换字符串null
,请使用null-coalescing运算符。
e.g。
string[] myArray = new [] {
o.id, o.number.ToStringOrNull(), o.whatever, ...
};// .Select(s=>s??"NULL").ToArray(); //uncomment to replace null with "NULL"
答案 2 :(得分:2)
这是我的建议。
以这种方式实现扩展方法“AsString”:
namespace ConsoleApplication1
{
public static class ObjectExtensions
{
public static string AsString(this object source)
{
if (source != null)
{
return source.ToString();
}
else
{
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
object a = null;
object b = "not null";
string someText = a.AsString();
}
}
}
现在你可以在整个引用有对象时返回字符串,如果引用没有对象,则返回null。
答案 3 :(得分:1)
您只需检查可以为null的字段,例如
foreach(MyObject o in MyObjectList)
string[] myArray = new string[] {
o.id,
(o.number == null ? "NULL" : o.number.toString(),
o.whatever, ... };
答案 4 :(得分:1)
您必须检查每个值。一个简短的方法就是这样:
string nullStr = "NULL";
foreach (MyObject o in MyObjectList) {
string[] myArray = new string[] {
o.id,
(o.number ?? nullStr).ToString(),
(o.whatever ?? nullStr).ToString(),
...
};
}
答案 5 :(得分:0)
如果您只想将非null元素放入数组中,则需要检查每个值。没有办法解决这个问题。
答案 6 :(得分:0)
我会选择以下两个选项之一:
1.正如其他人建议的那样,为要检查null的类型实现扩展方法。
2.如果您不能/不想使用扩展方法,您可以在MyObject中定义一个接受对象的辅助方法,并基本上进行相同的空检查。
string Check(object o)
{
return o == null ? null : o.ToString();
}
然后,您将使用此方法调用包装所需的每个属性。
foreach(MyObject o in MyObjectList)
string[] myArray = new string[] {o.id, o.Check(o.number), o.whatever, ...}