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 Read Jon Skeets blogpost的确切实现。

于 2012-04-15T12:16:00.563 回答
0

_centreOptions此行适用于Enumerable中的每个元素:

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

并检查Id对象是否等于_purchase.Centre.Id
它将返回满足条件的第一个元素。

所以你会id在两次迭代中看到两个。

于 2012-04-15T12:11:03.300 回答