0

さて、ユーザーが入力したテキストで LIST を検索するために使用する次のクエリがあります。

以下のすべてのフィールドを検索するのは 1 つのテキスト ボックスだけですが、機能していますが、これらのフィールドの 1 つが null の場合、null 参照例外がスローされます。どうすれば回避できますか?

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())));

                }
            }

皆さんが私を助けてくれることを願っています。ありがとう。

4

4 に答える 4

0

あなたがしていることを行うには多くの方法がありますが、おそらくもっとエレガントなものもあります。

簡単な方法の 1 つ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可読性と保守性を向上させることができるかもしれません。

于 2013-10-07T14:10:24.373 に答える
0

null objectのようなものを導入する必要があるかもしれません。このオブジェクトは空であるため、それに対するすべてのクエリで常に false を返します。

そのオブジェクトのすべてのプロパティに nullchecks を実装すると、コードは時間の経過とともに腐敗します。そして、あなたは悪い時間を過ごすつもりです。

于 2013-10-07T14:07:44.173 に答える