Code coverage: 100%
Check the methods ported from C# IEnumerable[T] here in the enumerable interface definition
If you are new to IEnumerable, you can [explore & read examples by Microsoft](ported from C#).
got := goe.NewIEnumerable[string]("Hello", "World").
Where(func(v string) bool {
return len(v) < 3
}).
OrderDescending().GetOrderedEnumerable().
Reverse().
FirstOrDefault(nil, goe.Ptr("Oops"))
fmt.Println(got)
// "Oops"array := []byte{0, 70, 99, 106, 106, 109, 30, 85, 109, 112, 106, 98, 99, 66, 88, 69}
got := goe.NewIEnumerable[byte](array...).
Skip(1).
Take(11).
Select(transform).
CastInt32().
Append('"').
AggregateAnySeed("\"", aggregate)
fmt.Println(got)
// "Hello World"Due to limitation of Go that does not allow generic type in struct method, the following methods are defined in goe_helper package as utility methods, instead of attaching directly into the IEnumerable instance:
- Chunk
- GroupBy
- GroupJoin
- Join
- OfType
- Zip
Example: ❌ instance.Chunk(size:2) | ✅ goe_helper.Chunk(instance, size:2)
The following methods are implemented IEnumerable instance but also implemented in goe_helper package, since methods in helper package is more likely C# method signature.
- Select
- SelectMany
- Aggregate
- Empty
- Repeat
Some IEnumerable[T] methods like Order, Distinct, Except, Union, Intersect,... need value comparator to compare between each element in the sequence and the IComparer[T] is needed.
This is definition of IComparer[T] in comparers package:
// IComparer use methods Compare* to compare value of 2 input values.
//
// If left is less than right, returns -1.
//
// If left is equals to right, returns 0.
//
// If left is greater than right, returns 1.
type IComparer[T any] interface {
// CompareTyped compares value from params.
//
// If x is less than y, returns -1.
//
// If x is equals to y, returns 0.s
//
// If x is greater than y, returns 1.
CompareTyped(x, y T) int
// CompareAny accept any params.
//
// If both x and y are nil, return 0.
//
// If x is nil and y is not nil, return -1.
//
// If x is not nil and y is nil, return 1.
//
// The rest, implement in your own way, since type any means you can pass everything here,
// and you should handle them carefully
CompareAny(x, y any) int
}See implementation sample in example.
go-ienumerable will attempts to resolve a default comparer using predefined comparers for some type. You can register a comparer for YourType by implement your own IComparer[YourType].
See sample of implement and default comparer registration for custom types and other types in example.
Predefined IComparer[T]: string, bool, numeric (int, int8/16/32/64, uint, uint8/16/32/64, float32/64, complex64/128), *big.Int, *big.Float, time.Time with corresponding initialized comparer instance, eg: compares.StringComparer is a string comparer, compares.NumericComparer is comparer of numeric and so on.