使用LINQ的魔力 - 如何为匹配的每个条件调用委托?

时间:2010-01-02 22:08:40

标签: linq lambda

我想做这样的事情:

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)

这怎么可能? :)

4 个答案:

答案 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);
}