4

与えられたコード:

from i in this.GridViewFoo.SelectedItems
select new EmployeeEntity
{
    EmployeeID = (i as EmployeeDto).EmployeeID,
    Email = this.GetAllEmail((i as EmployeeDto).Email, (i as EmployeeDto).SecondaryEmails),
    EmployeeNumber = (i as EmployeeDto).EmployeeNumber,
    FirstName = (i as EmployeeDto).FirstName,
    LastName = (i as EmployeeDto).LastName
}

安全なキャストの後、(i as EmployeeDto)NullReferenceExceptionを受け取る場合があります。コードの安全性を確保し、多くのnullチェックで彼を過負荷にしないようにするにはどうすればよいですか?

ソリューションの概要:

ソリューションが機能しているかどうかを確認するために、いくつかのテストを行いました。どちらもうまく機能しており、同じ結果が得られます。こちらで確認できます。その後、OfTypeSolutionletSolutionを使用していくつかのパフォーマンステストを行いました。

OfTypeソリューションは平均してより良い時間を持っているので、これが答えになります!

4

2 に答える 2

10

の前にOfTypeを使用できますSelect

from i in this.GridViewFoo.SelectedItems.OfType<EmployeeDto>()
select new EmployeeEntity
{
    EmployeeID = i.EmployeeID,
    Email = this.GetAllEmail(i.Email, i.SecondaryEmails),
    EmployeeNumber = i.EmployeeNumber,
    FirstName = i.FirstName,
    LastName = i.LastName
}

EmployeeDtoからのタイプ項目のみを提供するSelectedItemsため、キャストや null チェックは必要ありません。

于 2012-09-19T15:22:26.337 に答える
2
from si in this.GridViewFoo.SelectedItems
let i = si as EmployeeDto
where i != null
select new EmployeeEntity
{
    EmployeeID = i.EmployeeID,
    Email = this.GetAllEmail(i.Email, i.SecondaryEmails),
    EmployeeNumber = i.EmployeeNumber,
    FirstName = i.FirstName,
    LastName = i.LastName
}
于 2012-09-19T15:27:42.597 に答える