我想做这样的事情:
List<string> list = new List<string>();
... put some data in it ...
list.CallActionForEachMatch(x=>x.StartsWith("a"), ()=> Console.WriteLine(x + " matches!"););
Syntax: CallActionForEachMatch(Criteria, Action)
这怎么可能? :)
答案 0 :(得分:6)
我不会;我只是用:
foreach(var item in list.Where(x=>x.StartsWith("a"))) {
Console.WriteLine(item + " matches!");
}
但你可以使用:
list.FindAll(x=>x.StartsWith("a"))
.ForEach(item=>Console.WriteLine(item + " matches!"));
答案 1 :(得分:3)
list.FindAll(x=>x.StartsWith("a"))
.ForEach(x => Console.WriteLine(x + " matches!"));
或者您可以编写自己的CallActionForEachMatch扩展名:
public static void CallActionForEachMatch<T>(this IEnumerable<T> values, Func<T, bool> pred, Action<T> act)
{
foreach (var value in values.Where(pred))
{
act(value);
}
}
答案 2 :(得分:3)
编写扩展方法:
static class IEnumerableForEachExtensions {
public static void ForEachMatch<T>(this IEnumerable<T> items,
Predicate<T> predicate,
Action<T> action
) {
items.Where(x => predicate(x)).ForEach(action);
}
public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) {
foreach(T item in items) {
action(item);
}
}
}
用法:
// list is List<string>
list.ForEachMatch(s => s.StartsWith("a"), s => Console.WriteLine(s));
请注意,这是完全一般的,因为它会吃任何IEnumerable<T>
。请注意,由于明显的副作用,有些人会认为这是滥用LINQ。
答案 3 :(得分:2)
这样的扩展方法:
static public void CallActionForEachMatch(this List<T> list, Func<T, bool> criteria, Action<T> action)
{
list.Where(criteria).ToList().ForEach(action);
}