123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package help
- // Select projects each element of a collection into a new form. Returns a query
- // with the result of invoking the transform function on each element of
- // original source.
- //
- // This projection method requires the transform function, selector, to produce
- // one value for each value in the source collection. If selector returns a
- // value that is itself a collection, it is up to the consumer to traverse the
- // subcollections manually. In such a situation, it might be better for your
- // query to return a single coalesced collection of values. To achieve this, use
- // the SelectMany method instead of Select. Although SelectMany works similarly
- // to Select, it differs in that the transform function returns a collection
- // that is then expanded by SelectMany before it is returned.
- func (q Query) Select(selector func(interface{}) interface{}) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- return func() (item interface{}, ok bool) {
- var it interface{}
- it, ok = next()
- if ok {
- item = selector(it)
- }
- return
- }
- },
- }
- }
- // SelectT is the typed version of Select.
- // - selectorFn is of type "func(TSource)TResult"
- // NOTE: Select has better performance than SelectT.
- func (q Query) SelectT(selectorFn interface{}) Query {
- selectGenericFunc, err := newGenericFunc(
- "SelectT", "selectorFn", selectorFn,
- simpleParamValidator(newElemTypeSlice(new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- selectorFunc := func(item interface{}) interface{} {
- return selectGenericFunc.Call(item)
- }
- return q.Select(selectorFunc)
- }
- // SelectIndexed projects each element of a collection into a new form by
- // incorporating the element's index. Returns a query with the result of
- // invoking the transform function on each element of original source.
- //
- // The first argument to selector represents the zero-based index of that
- // element in the source collection. This can be useful if the elements are in a
- // known order and you want to do something with an element at a particular
- // index, for example. It can also be useful if you want to retrieve the index
- // of one or more elements. The second argument to selector represents the
- // element to process.
- //
- // This projection method requires the transform function, selector, to produce
- // one value for each value in the source collection. If selector returns a
- // value that is itself a collection, it is up to the consumer to traverse the
- // subcollections manually. In such a situation, it might be better for your
- // query to return a single coalesced collection of values. To achieve this, use
- // the SelectMany method instead of Select. Although SelectMany works similarly
- // to Select, it differs in that the transform function returns a collection
- // that is then expanded by SelectMany before it is returned.
- func (q Query) SelectIndexed(selector func(int, interface{}) interface{}) Query {
- return Query{
- Iterate: func() Iterator {
- next := q.Iterate()
- index := 0
- return func() (item interface{}, ok bool) {
- var it interface{}
- it, ok = next()
- if ok {
- item = selector(index, it)
- index++
- }
- return
- }
- },
- }
- }
- // SelectIndexedT is the typed version of SelectIndexed.
- // - selectorFn is of type "func(int,TSource)TResult"
- // NOTE: SelectIndexed has better performance than SelectIndexedT.
- func (q Query) SelectIndexedT(selectorFn interface{}) Query {
- selectGenericFunc, err := newGenericFunc(
- "SelectIndexedT", "selectorFn", selectorFn,
- simpleParamValidator(newElemTypeSlice(new(int), new(genericType)), newElemTypeSlice(new(genericType))),
- )
- if err != nil {
- panic(err)
- }
- selectorFunc := func(index int, item interface{}) interface{} {
- return selectGenericFunc.Call(index, item)
- }
- return q.SelectIndexed(selectorFunc)
- }
|