@@ -21,7 +21,7 @@ public abstract class ExpressionVisitor(bool isCaching = false) : System.Linq.Ex
21
21
{
22
22
private readonly Dictionary < Expression , Expression > cache = isCaching ? new ( ) : null ;
23
23
24
- protected virtual IReadOnlyList < Expression > VisitExpressionList ( IReadOnlyList < Expression > expressions ) =>
24
+ protected virtual IEnumerable < Expression > VisitExpressionList ( IReadOnlyList < Expression > expressions ) =>
25
25
VisitList ( expressions , Visit ) ;
26
26
27
27
public override Expression Visit ( Expression e )
@@ -69,7 +69,7 @@ protected virtual ElementInit VisitElementInitializer(ElementInit initializer)
69
69
/// </summary>
70
70
/// <param name="original">The original element initializer list.</param>
71
71
/// <returns>Visit result.</returns>
72
- protected virtual IReadOnlyList < ElementInit > VisitElementInitializerList ( ReadOnlyCollection < ElementInit > original ) =>
72
+ protected virtual IEnumerable < ElementInit > VisitElementInitializerList ( ReadOnlyCollection < ElementInit > original ) =>
73
73
VisitList ( original , VisitElementInitializer ) ;
74
74
75
75
/// <inheritdoc/>
@@ -236,29 +236,31 @@ protected override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBind
236
236
/// </summary>
237
237
/// <param name="original">The original binding list.</param>
238
238
/// <returns>Visit result.</returns>
239
- protected virtual IReadOnlyList < MemberBinding > VisitBindingList ( ReadOnlyCollection < MemberBinding > original ) =>
239
+ protected virtual IEnumerable < MemberBinding > VisitBindingList ( ReadOnlyCollection < MemberBinding > original ) =>
240
240
VisitList ( original , VisitBinding ) ;
241
241
242
- public static IReadOnlyList < T > VisitList < T > ( IReadOnlyList < T > original , Func < T , T > func ) where T : class
242
+ public static IEnumerable < T > VisitList < T > ( IReadOnlyList < T > original , Func < T , T > func ) where T : class
243
243
{
244
- T [ ] ar = null ;
245
- for ( int i = 0 , n = original . Count ; i < n ; i ++ ) {
244
+ for ( int i = 0 , n = original . Count ; i < n ; ++ i ) {
246
245
var originalValue = original [ i ] ;
247
- var p = func ( originalValue ) ;
248
- if ( ar != null ) {
249
- ar [ i ] = p ;
250
- }
251
- else if ( ! ReferenceEquals ( p , originalValue ) ) {
252
- ar = new T [ n ] ;
253
- for ( int j = 0 ; j < i ; j ++ ) {
254
- ar [ j ] = original [ j ] ;
255
- }
256
- ar [ i ] = p ;
246
+ if ( func ( originalValue ) is var p && ! ReferenceEquals ( p , originalValue ) ) {
247
+ return VisitListIterator ( original , func , p , i ) ;
257
248
}
258
249
}
259
- return ar ? . AsSafeWrapper ( ) ?? original ;
250
+ return original ;
260
251
}
261
252
253
+ private static IEnumerable < T > VisitListIterator < T > ( IReadOnlyList < T > original , Func < T , T > func , T p , int pIdx ) where T : class
254
+ {
255
+ for ( var i = 0 ; i < pIdx ; ++ i ) {
256
+ yield return original [ i ] ;
257
+ }
258
+ yield return p ;
259
+ for ( int i = pIdx + 1 , n = original . Count ; i < n ; ++ i ) {
260
+ yield return func ( original [ i ] ) ;
261
+ }
262
+ }
263
+
262
264
protected override MemberListBinding VisitMemberListBinding ( MemberListBinding binding )
263
265
{
264
266
var bindingInitializers = binding . Initializers ;
0 commit comments