【问题标题】:Execute Action<T> by IEnumerable Characteristics?通过 IEnumerable 特征执行 Action<T>?
【发布时间】:2012-03-29 12:43:33
【问题描述】:

我有这个代码:

 int[] g = new int[3] { 1, 2, 3 };
 g.ToList().ForEach(f=>Console.Write(f));

对于数组中的每一项,我想执行一个Action....

int[]已经实现Ienumerable

我想执行一个没有“ToList()”的动作

是否有任何其他解决方案(使用 one 行代码)来做到这一点(没有 toList?即使用其 IEnumerable 特性)

【问题讨论】:

标签: c# linq .net-4.0 action


【解决方案1】:

您可以改用Array.ForEach

Array.ForEach(g, f => Console.Write(f));

甚至1

Array.ForEach(g, Console.Write);

我个人可能会使用 foreach 循环来代替 reasons given by Eric Lippert...


1 如果它编译。我已经放弃尝试预测方法组转换是否会在泛型类型推断的上下文中起作用。

【讨论】:

  • 哦,所以它也可以在Array 上使用!我从来没有意识到这一点。
  • @BoltClock:是的,但只能通过 static 方法,而不是 List&lt;T&gt; 中的 instance 方法
  • 查看我对此的回答。
【解决方案2】:

ForEach()List 类中的方法,而不是IEnumerable 接口,因此不能直接用于数组。

如果您对只用一行代码和IEnumerable 执行此操作非常执着,您可以使用(或滥用)类似Any()All() 的方法并在返回之前执行您想要的操作(在本例中为打印)一个适当的值,会导致迭代继续。

或者您可以改用Array.ForEach()

【讨论】:

    【解决方案3】:

    受 Jon Skeet 的启发,我写了一个有用的扩展方法:

    客户:

    var jobs = new List<Job>() 
        { 
            new Job { Id = "XAML Developer" }, 
            new Job { Id = "Assassin" }, 
            new Job { Id = "Narco Trafficker" }
        };
    jobs.Execute(ApplyFilter, j => j.Id);
    
    public void ApplyFilter(string filterId) { }
    

    扩展方法:

        public static void Execute<TSource, TKey>(this IEnumerable<TSource> source, Action<TKey> applyBehavior, Func<TSource, TKey> keySelector)
        {
            foreach (var item in source)
            {
                var target = keySelector(item);
                applyBehavior(target);
            }
        }
    

    【讨论】:

    • 不确定键选择器是否值得 - 毕竟,您始终可以在没有它的情况下使用 jobs.Select(j =&gt; j.Id).Execute(ApplyFilter)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2011-08-15
    相关资源
    最近更新 更多