【发布时间】:2016-08-19 15:58:17
【问题描述】:
似乎 FirstOrDefault 的预期行为是在找到与谓词匹配的项目后完成,而 concat 的预期行为是懒惰地评估。但是,即使谓词与第一项匹配,以下示例也会枚举整个集合。
(感谢更友好的代码 Shlomo)
void Main()
{
var entities = Observable.Defer(() => GetObservable().Concat());
Entity result = null;
var first = entities.FirstOrDefaultAsync(i => i.RowId == 1).Subscribe(i => result = i);
result.Dump();
buildCalled.Dump();
}
// Define other methods and classes here
public IEnumerable<IObservable<Entity>> GetObservable()
{
var rows = new List<EntityTableRow>
{
new EntityTableRow { Id = 1, StringVal = "One"},
new EntityTableRow { Id = 2, StringVal = "Two"},
};
return rows.Select(i => Observable.Return(BuildEntity(i)));
}
public int buildCalled = 0;
public Entity BuildEntity(EntityTableRow entityRow)
{
buildCalled++;
return new Entity { RowId = entityRow.Id, StringVal = entityRow.StringVal };
}
public class Entity
{
public int RowId { get; set; }
public string StringVal { get; set; }
}
public class EntityTableRow
{
public int Id { get; set; }
public string StringVal { get; set; }
}
这是预期的行为吗?有没有办法将对象(特别是本例中的建筑物)的枚举推迟到真正需要时?
【问题讨论】:
标签: c# linq system.reactive rx-java lazy-evaluation