LINQ equivalent of foreach for IEnumerable

后端 未结 22 2268
夕颜
夕颜 2020-11-21 22:54

I\'d like to do the equivalent of the following in LINQ, but I can\'t figure out how:

IEnumerable items = GetItems();
items.ForEach(i => i.DoS         


        
22条回答
  •  悲&欢浪女
    2020-11-21 23:42

    I respectually disagree with the notion that link extension methods should be side-effect free (not only because they aren't, any delegate can perform side effects).

    Consider the following:

       public class Element {}
    
       public Enum ProcessType
       {
          This = 0, That = 1, SomethingElse = 2
       }
    
       public class Class1
       {
          private Dictionary> actions = 
             new Dictionary>();
    
          public Class1()
          {
             actions.Add( ProcessType.This, DoThis );
             actions.Add( ProcessType.That, DoThat );
             actions.Add( ProcessType.SomethingElse, DoSomethingElse );
          }
    
          // Element actions:
    
          // This example defines 3 distict actions
          // that can be applied to individual elements,
          // But for the sake of the argument, make
          // no assumption about how many distict
          // actions there may, and that there could
          // possibly be many more.
    
          public void DoThis( Element element )
          {
             // Do something to element
          }
    
          public void DoThat( Element element )
          {
             // Do something to element
          }
    
          public void DoSomethingElse( Element element )
          {
             // Do something to element
          }
    
          public void Apply( ProcessType processType, IEnumerable elements )
          {
             Action action = null;
             if( ! actions.TryGetValue( processType, out action ) )
                throw new ArgumentException("processType");
             foreach( element in elements ) 
                action(element);
          }
       }
    

    What the example shows is really just a kind of late-binding that allows one invoke one of many possible actions having side-effects on a sequence of elements, without having to write a big switch construct to decode the value that defines the action and translate it into its corresponding method.

提交回复
热议问题