好吧,我使用以下查询来搜索LIST,其中包含用户填写的文本。
只有一个文本框可以搜索下面的所有这些字段,它正在工作但是当其中一个字段为空时,它会抛出一个空引用异常,我该如何避免呢?
List<REP_MEDIDORDISPLAY> SearchFiltered = new List<REP_MEDIDORDISPLAY>();
if (filter != String.Empty)
{
SearchFiltered.Clear();
foreach (String Item in filter.Split(';').ToList<String>())
{
SearchFiltered.AddRange(Medidores.Where(x => x.Data_TOI.Contains(Item.Trim()) ||
x.Elemento.ToUpper().Contains(Item.Trim()) ||
x.Fase.ToUpper().Contains(Item.Trim()) ||
x.ID.ToUpper().Contains(Item.Trim()) ||
x.KdKe.ToUpper().Contains(Item.Trim()) ||
x.N_Equipamento.ToUpper().Contains(Item.Trim()) ||
x.Status.ToUpper().Contains(Item.Trim()) ||
x.Tensao.ToUpper().Contains(Item.Trim())));
}
}
我希望你们能帮助我。感谢。
答案 0 :(得分:2)
首先检查null
:
(x.Elemento != null && x.Elemento.ToUpper().Contains(Item.Trim())) ||
// etc
当然,您还应该只计算一次Item.Trim()
,并将此值重复用于所有测试,而不是像字段一样多次修剪。
答案 1 :(得分:2)
您可以为每个属性添加空检查。例如:
这
x.Fase.ToUpper().Contains(Item.Trim()) ||
要
(x.Fase != null && x.Fase.ToUpper().Contains(Item.Trim())) ||
答案 2 :(得分:0)
也许你应该介绍像null object这样的东西。此对象为空,因此在每次查询时都会返回false。
如果对该对象上的每个属性实施nullcheck,则代码会随着时间的推移而腐烂。你会度过一段美好的时光。
答案 3 :(得分:0)
有很多方法可以做你正在做的事情,也许有些更优雅。
一种简单的方法是覆盖ToString
序列中对象中的Medidores
方法,并将其用于比较。
这样的事情:
class Medidor {
... properties
public override string ToString() {
return Data_TOI + Elemento ... etc
}
}
然后你可以与之比较。
SearchFiltered.AddRange(
Medidores.Where(x =>
x.ToString()
.IndexOf(Item.Trim(), 0, StringComparison.InvariantCultureIgnoreCase) != -1
);
我正在使用IndexOf
,因为它有一个需要StringComparison.InvariantCultureIgnoreCase
的重载,忽略了其他内容。
我认为这种方法比现在更受欢迎的原因是Meridor
对象本身负责ToString
方法中包含的字段。也许它可以提高可读性和可维护性。