diff --git a/enumerable.go b/enumerable.go index f3f234c..96f0421 100644 --- a/enumerable.go +++ b/enumerable.go @@ -56,6 +56,21 @@ func (receiver Enumerable[T]) First() T { return t } +// First 查找符合条件的第一个指针元素 +func (receiver Enumerable[T]) FirstAddr() *T { + if receiver.lock == nil { + return nil + } + + receiver.lock.RLock() + defer receiver.lock.RUnlock() + + if len(*receiver.source) > 0 { + return &(*receiver.source)[0] + } + return nil +} + // Last 集合最后一个元素 func (receiver Enumerable[T]) Last() T { if receiver.lock == nil { diff --git a/test/enumerable_test.go b/test/enumerable_test.go index 0699768..4b8965b 100644 --- a/test/enumerable_test.go +++ b/test/enumerable_test.go @@ -87,6 +87,20 @@ func Test_enumerable_First(t *testing.T) { assert.Equal(t, 1, lst.First()) } +func Test_enumerable_FirstAddr(t *testing.T) { + type Name struct { + Age int + } + lst := collections.NewList[Name](Name{Age: 8}) + assert.Equal(t, 8, lst.First().Age) + + item := lst.FirstAddr() + item.Age = 99 + + assert.Equal(t, 99, lst.First().Age) + assert.Equal(t, 99, lst.FirstAddr().Age) +} + func Test_enumerable_Last(t *testing.T) { lst := collections.NewList[int](1, 2, 3, 4, 5, 6) assert.Equal(t, lst.Last(), 6)