为泛型c#集合中的每个值调用一个函数

这个问题在这里已经有了答案:

  • 通过LINQ将函数应用于所有收集元素[复制] 8个答案
  • LINQ相当于foreach for IEnumerable <T> 21个答案

  • LINQ在这里没有帮助,但你可以使用List<T>.ForEach

    列表<T> .ForEach方法

    对List的每个元素执行指定的操作。

    例:

    myList.ForEach(p => myFunc(p));
    

    传递给lambda表达式的值是列表项,因此在此示例中,如果myListList<long>p是一个long


    正如其他海报所指出的,您可以使用List<T>.ForEach

    但是,您可以轻松编写一个扩展方法,使您可以在任何IEnumerable<T>上使用ForEach

    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        foreach(T item in source)
            action(item);
    }
    

    这意味着你现在可以做到:

    myList.Where( ... ).ForEach( ... );
    

    邑! 你可以使用List.ForEach但问题是只适用于列表(当然,你可以将所有东西改变为一个List,但代码更少有趣:) )。 除此之外,您必须使用不提供任何返回类型的Action<>预测。

    无论如何,有一个你想要的答案,你可以用你用Func<>猜测的相同方式来做到这一点,但是有一个小小的技巧,如下所示:

    我会在飞行中尽一切努力:

    string[] items = (new string[] { "d", "f" }).
        Select(x => new Func<string>(() => { 
            //Do something here...
            Console.WriteLine(x); 
            return x.ToUpper(); 
        }
    )).Select(t => t.Invoke()).ToArray<string>();
    

    这里有一些要点:

    首先 ,我定义了一个可以被任何支持LINQ的集合取代的字符串数组。

    其次Select一个Func<string>内部将为给定数组的每个元素声明为x

    (查看空括号并记住当你定义一个Func<type**1**, type**2**, ..., type**n**>总是最后一个类型是返回类型,所以当你只写Func<string>它表示一个没有输入参数的函数,它的返回类型是字符串)

    很明显,我们希望使用给定数组上的函数(new string[] { "d", "f" }) ,这就是为什么我定义一个没有参数的函数,并且我也使用了相同的变量x Func<>引用相同的数组元素。

    第三 ,如果你不放第二个Select,那么你有一个返回字符串的两个函数的集合,并且他们已经从第一个数组获得它们的输入。 你可以做到这一点,并将结果保存在一个anonymous变量中,然后调用他们的.Invoke方法。 我写在这里:

    var functions = (new string[] { "d", "f" }).
           Select(x => new Func<string>(() => { 
              //Do something here...
              Console.WriteLine(x); 
              return x.ToUpper(); 
           }));
    string[] items = functions.Select(t => t.Invoke()).ToArray<string>();
    

    最后 ,我将结果转换为数组! 现在你有一个字符串数组!

    对不起,它会变长! 我希望它会有用。

    链接地址: http://www.djcxy.com/p/52995.html

    上一篇: call a function for each value in a generic c# collection

    下一篇: Apply function to all elements of collection through LINQ