7

nullになる可能性のあるオブジェクトの配列(配列)からプロパティを取得しようとしていますが、常にnull参照例外が発生します。

nullの場合に処理しないように、または空の文字列を返すようにLINQに指示するにはどうすればよいですか?

foreach (Candidate c in candidates) {
   results.Add(new Person 
      { 
         firstName = c.firstname, //ok
         lastName = c.Name, //ok

         // contactItems is an array of ContactItem
         // so it can be null that's why I get null exception 
         // when it's actually null
         phone = c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText 
      }
   );
}

私はまた、nullを取らないようにそれを試みました。配列がnullの場合に処理しないようにLINQに指示するメカニズムがありません。

phone = c.address.contactItems.Where( ci => ci != null && ci.contactType == ContactType.PHONE).First().contactText
4

6 に答える 6

13

null(条件付き?:)演算子を使用しているかどうかを確認できます:

phone = c.address.contactItems == null ? ""
    : c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText 

First誰もいないために例外をスローした場合、カスタムのデフォルト値でContactType.PHONE使用できます。DefaultIfEmpty

c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE)
                      .DefaultIfEmpty(new Contact{contactText = ""})
                      .First().contactText 

Firstデフォルト値を指定したため、例外をスローできなくなったことに注意してください。

于 2013-01-10T14:26:03.400 に答える
2

以下のコードを試してください(私はそれがであると仮定しましcontactTextstring)。

公有財産名の大文字と小文字をすべて大文字で始めるように標準化することを検討することをお勧めします。

foreach (Candidate c in candidates) {
    string contactText =
        c.address.contactItems
            .Where(ci => ci.contactType == ContactType.PHONE)
            .Select(ci => ci.contactText)
            .FirstOrDefault()

    results.Add(
        new Person 
        { 
            firstName = c.firstname,
            lastName = c.Name,
            phone = contactText ?? string.Empty
        });
}
于 2013-01-10T14:29:53.537 に答える
1

the null value is contactType so we add (ci.contactType != null)

    var phone = c.address.contactItems.Where( ci => (ci.contactType != null) && ci.contactType == ContactType.PHONE).First().contactText
于 2013-01-10T14:25:02.783 に答える
1

試す:

var contact = c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).FirstOrDefault();
 phone = contact != null ? contact.contactText : "";
于 2013-01-10T14:23:47.017 に答える
0
foreach (Candidate c in candidates) {
results.Add(new Person 
  { 
     firstName = c.firstname, //ok
     lastName = c.Name, //ok

     // contactItems is an array of ContactItem
     // so it can be null that's why I get null exception 
     // when it's actually null
     phone = c.address.contactItems == null
          ? string.Empty
          :c.address.contactItems.Where( ci => ci.contactType == ContactType.PHONE).First().contactText 
  }

); }

于 2013-01-10T14:22:51.400 に答える
0

以下のようにlinqで引数null例外を回避します

 Summaries = (from r in Summaries
              where r.Contains(SearchTerm)
              orderby r
              select r).ToArray();

この場合、nullがsearchTermに渡されると、次のようにnull式を確認できます。

 Summaries = (from r in Summaries
              where string.IsNullOrEmpty(SearchTerm) ||r.Contains(SearchTerm)
              orderby r
              select r).ToArray();

わたしにはできる!

于 2021-03-09T06:55:29.077 に答える