0

次の行がわかりません。x => x.Id == _purchase.Centre.Id

コードはここにあります:

private void LoadCentreOptions()
{
    MaterialCentreDataSource mcds = new MaterialCentreDataSource();
    List<MaterialCentre> centres = mcds.GetAll() as List<MaterialCentre>;

    _blankCentre = new MaterialCentre()
    {
        Name = Strings.JournalViewModel_CreditedPartyOption_NotSpecified
    };

    centres.Insert(0, _blankCentre);
    _centreOptions = new ReadOnlyCollection<MaterialCentre>(centres);

    if (_purchase.Centre == null)
        _purchase.Centre = _blankCentre;
    else
        _purchase.Centre = _centreOptions.First(x => x.Id == _purchase.Centre.Id);
}

ここでデバッグ時に、X.Idがインクリメントされるのを監視しています。どうすれば可能ですか?

4

2 に答える 2

5

APIFirstはコレクションを列挙し、条件を適用して、どれが一致するかを確認してから、最初の一致を返します。したがって、コードは効果的に次のように変換されます。

foreach(var centreOption in _centreOptions)
{
    if(centreOption.Id==_purchase.Centre.Id)
        return centreOption;
}

LINQを理解している場合は、基本的に

_centreOptions.Where(x => x.Id == _purchase.Centre.Id).First();

Firstの正確な実装を理解するには、JonSkeetsのブログ投稿を読んでください。

于 2012-04-15T12:16:00.563 に答える
0

この行は、_centreOptionsEnumerableのすべての要素に対して実行されます。

_purchase.Centre = _centreOptions.First(x => x.Id == _purchase.Centre.Id);

そしてId、オブジェクトのがに等しいかどうかをチェックし_purchase.Centre.Idます。
条件を満たす最初の要素を返します。

したがってid、2回の反復で2回表示されます。

于 2012-04-15T12:11:03.300 に答える