FirstOrDefaultの予想される動作は、述語と一致するアイテムを見つけた後、遅延の評価を行うためのものです。ただし、次の例では、述語が最初の項目に一致してもコレクション全体が列挙されます。C#Reactive Extensions(rx)FirstOrDefaultは、コレクション全体を列挙します
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; }
}
(友好コードシュロモためのおかげで)これは期待される動作ですか?本当に必要になるまで、オブジェクト(この場合は特に建物)の列挙を延期する方法はありますか?
http://stackoverflow.com/help/mcveを提供していただけますか? – Shlomo