2014-01-23 127 views
2

請參考下面避免空進入名單

1. persons = Items.Select(item => componentResolver.ResolvePerson(new TridionUri(item.Id))).ToList(); 
2. persons.Each(person => person.AdditionalInfo); // gives null reference exception 

ResolvePerson代碼如下:

public Person ResolvePerson(TridionUri personUri) 
{ 
    Person person = publicationResolverService.GetPerson(personUri); 
    if (author != null) 
    { 
     person.Id = personUri.ItemId.ToString(); 
    } 
    return person; 
} 

現在的問題是,「項目」包含一個ID爲它的人是不存在的。所以我的'ResolvePerson'返回一個null。這導致第2行發生異常。我只能控制ResolvePerson方法。有沒有辦法可以跳過沒有人在那裏而不是返回null的personUri?

+1

'Each'是'IEnumerable'擴展或其'錯字「假」 Person ForEach'? –

+0

IEnumerable擴展。 –

+1

然後只需使用@wudzik的解決方案 –

回答

1

你應該過濾掉空項的where子句。但是,如果你不能控制代碼就像你說的,你可以返回知道這是假的,所以沒有任何當你調用AdditionalInfo

Person person = publicationResolverService.GetPerson(personUri); 
if (author != null) 
{ 
    person.Id = personUri.ItemId.ToString(); 
} 
else 
{ 
    person = _fakePerson; 
} 
return person; 
+0

這是什麼_fakePerson?這是一個我將不得不創建Person類的對象嗎? –

+0

@RossCooper這基本上是一個黑客攻擊,所以它取決於AdditionalInfo的功能。你不能過濾出空值,但是你可以創建一個'Person'的實例,當AdditionalInfo被調用時它不會做任何事情。這當然需要改變'Person'的實現。 – i3arnon

+0

@RossCooper如果你向我們展示'person'類和'Each'擴展方法,會更容易 – i3arnon

5

可以使用使用WhereLinq撥打第二線之前過濾空者

persons.Where(person => person != null).Each(person => person.AdditionalInfo); 
+0

我無法控制這個文件。只有ResolvePerson方法是我可以編輯的。 –