Robert Klemme
6/20/2005 2:59:00 PM
Csaba Henk wrote:
> On Mon, Jun 20, 2005 at 11:31:09PM +0900, G?bor SEBESTY?N wrote:
>>
>> On 2005.06.20., at 14:10, Robert Klemme wrote:
>>
>>> What exactly do you want to do with the collection?
>>>
>> I want to get the first N pieces of "valid" objects from a
>> collection. I would iterate in collection counting how many objects
>> were sucessfully accepted and would break the cycle if there are no
>> more objects or I already have my N objects. Here's my solution
>> (written for Rails and the collection consists of ActiveRecord
>> objects):
>>
>> cl = CustomerQueue.find(:all, :conditions => cond, :order =>
>> "created_at ASC")
>>
>> i = 0
>> while i < cl.size and n > 0
>> c = _openChat(cl[i].customer_id, @session[:user].id)
>> unless c.nil?
>> chats << c
>> n = n - 1
>> end
>> end
>>
>> I don't like referencing by index. That's why I asked you how to
>> implement this using iterator and not a simple while cycle with
>> indexing.
>
> Maybe
>
> cl.each_with_index { |e,i|
> i < n or break
> c = _openChat(e.customer_id, @session[:user].id) and chats << c
> }
Nah, this cries for #inject!
found = collection.inject([]) do |f,x|
if check_condition(x)
f << x
break f if f.size >= 10
end
f
end
>> (0..100).inject([]){|f,x| if x%3==0 then f << x; break f if f.size ==
10 end; f}
=> [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>> (0..10).inject([]){|f,x| if x%3==0 then f << x; break f if f.size == 10
end; f}
=> [0, 3, 6, 9]
:-)
Kind regards
robert