为泛型c#集合中的每个值调用一个函数
这个问题在这里已经有了答案:
LINQ在这里没有帮助,但你可以使用List<T>.ForEach
:
列表<T> .ForEach方法
对List的每个元素执行指定的操作。
例:
myList.ForEach(p => myFunc(p));
传递给lambda表达式的值是列表项,因此在此示例中,如果myList
是List<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