@@ -35,17 +35,21 @@ public static AttributeValue FromDictionary<T, TArgument>(
3535 string ? dataMember ,
3636 Func < T , TArgument , string ? , AttributeValue > resultSelector )
3737 {
38- var elements = dictionary switch
38+ Dictionary < string , AttributeValue > dict ;
39+ if ( dictionary . TryGetNonEnumeratedCount ( out var count ) )
3940 {
40- IReadOnlyDictionary < string , T > a => new Dictionary < string , AttributeValue > ( a . Count ) ,
41- IDictionary < string , T > a => new Dictionary < string , AttributeValue > ( a . Count ) ,
42- _ => new Dictionary < string , AttributeValue > ( )
43- } ;
41+ if ( count is 0 )
42+ return new AttributeValue { M = [ ] } ;
43+
44+ dict = new Dictionary < string , AttributeValue > ( count ) ;
45+ }
46+ else
47+ dict = [ ] ;
4448
4549 foreach ( var ( key , value ) in dictionary )
46- elements [ key ] = resultSelector ( value , argument , $ "{ dataMember } [{ key } ]") ;
50+ dict [ key ] = resultSelector ( value , argument , $ "{ dataMember } [{ key } ]") ;
4751
48- return new AttributeValue { M = elements } ;
52+ return new AttributeValue { M = dict } ;
4953 }
5054
5155 public static AttributeValue FromNullableNumberSet < T > ( IEnumerable < T ? > numbers , string ? _ )
@@ -239,7 +243,7 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
239243 {
240244 return ToStringSet < HashSet < string > > ( ss , i => new HashSet < string > ( i ) , dataMember ) ;
241245 }
242-
246+
243247 public static ISet < string ? > ToNullableStringISet ( List < string ? > ss , string ? dataMember )
244248 {
245249 return ToNullableStringSet < HashSet < string ? > > ( ss , i => new HashSet < string ? > ( i ) , dataMember ) ;
@@ -259,11 +263,12 @@ public static HashSet<string> ToStringHashSet(List<string> ss, string? dataMembe
259263 {
260264 var span = CollectionsMarshal . AsSpan ( ss ) ;
261265 var set = new SortedSet < string ? > ( ) ;
262- foreach ( var se in span )
266+ foreach ( var se in span )
263267 set . Add ( se ) ;
264268
265269 return set ;
266270 }
271+
267272 public static SortedSet < string > ToStringSortedSet ( List < string > ss , string ? dataMember )
268273 {
269274 var span = CollectionsMarshal . AsSpan ( ss ) ;
@@ -383,6 +388,9 @@ public static Dictionary<string, T> ToDictionary<T, TArgument>(
383388 string ? dataMember ,
384389 Func < AttributeValue , TArgument , string ? , T > resultSelector )
385390 {
391+ if ( dictionary . Count is 0 )
392+ return [ ] ;
393+
386394 var elements = new Dictionary < string , T > ( dictionary . Count ) ;
387395
388396 foreach ( var ( key , value ) in dictionary )
@@ -398,6 +406,8 @@ public static AttributeValue FromArray<T, TArgument>(
398406 Func < T , TArgument , string ? , AttributeValue > resultSelector )
399407 {
400408 var span = array . AsSpan ( ) ;
409+ if ( span . Length is 0 )
410+ return new AttributeValue { L = [ ] } ;
401411 var attributeValues = new List < AttributeValue > ( span . Length ) ;
402412 for ( var i = 0 ; i < span . Length ; i ++ )
403413 attributeValues . Add ( resultSelector ( span [ i ] , argument , $ "{ dataMember } [{ i } ]") ) ;
@@ -412,6 +422,9 @@ public static AttributeValue FromList<T, TArgument>(
412422 Func < T , TArgument , string ? , AttributeValue > resultSelector )
413423 {
414424 var span = CollectionsMarshal . AsSpan ( list ) ;
425+ if ( span . Length is 0 )
426+ return new AttributeValue { L = [ ] } ;
427+
415428 var attributeValues = new List < AttributeValue > ( span . Length ) ;
416429 for ( var i = 0 ; i < span . Length ; i ++ )
417430 attributeValues . Add ( resultSelector ( span [ i ] , argument , $ "{ dataMember } [{ i } ]") ) ;
@@ -449,6 +462,9 @@ public static List<TResult> ToList<TResult, TArgument>(
449462 )
450463 {
451464 var span = CollectionsMarshal . AsSpan ( attributeValues ) ;
465+ if ( span . Length is 0 )
466+ return [ ] ;
467+
452468 var elements = new List < TResult > ( span . Length ) ;
453469 for ( var i = 0 ; i < span . Length ; i ++ )
454470 elements . Add ( resultSelector ( span [ i ] , argument , $ "{ dataMember } [{ i } ]") ) ;
@@ -463,8 +479,20 @@ public static IEnumerable<TResult> ToEnumerable<TResult, TArgument>(
463479 Func < AttributeValue , TArgument , string ? , TResult > resultSelector
464480 )
465481 {
466- for ( var i = 0 ; i < attributeValues . Count ; i ++ )
467- yield return resultSelector ( attributeValues [ i ] , argument , $ "{ dataMember } [{ i } ]") ;
482+ return attributeValues . Count is 0
483+ ? [ ]
484+ : Iterator ( attributeValues , argument , dataMember , resultSelector ) ;
485+
486+ static IEnumerable < TResult > Iterator (
487+ List < AttributeValue > list ,
488+ TArgument argument ,
489+ string ? dataMember ,
490+ Func < AttributeValue , TArgument , string ? , TResult > resultSelector
491+ )
492+ {
493+ for ( var i = 0 ; i < list . Count ; i ++ )
494+ yield return resultSelector ( list [ i ] , argument , $ "{ dataMember } [{ i } ]") ;
495+ }
468496 }
469497
470498 public static TResult [ ] ToArray < TResult , TArgument > (
@@ -475,6 +503,9 @@ public static TResult[] ToArray<TResult, TArgument>(
475503 )
476504 {
477505 var span = CollectionsMarshal . AsSpan ( attributeValues ) ;
506+ if ( span . Length is 0 )
507+ return [ ] ;
508+
478509 var elements = new TResult [ span . Length ] ;
479510 for ( var i = 0 ; i < span . Length ; i ++ )
480511 elements [ i ] = resultSelector ( span [ i ] , argument , $ "{ dataMember } [{ i } ]") ;
0 commit comments